Commit ac0ca60f authored by Laurence Farhi's avatar Laurence Farhi

Merge branch 'master' of gitlab.inria.fr:learninglab/mooc-rr/mooc-rr-ressources

parents b80c5178 a2aab722
*~
*.vrb
*.aux
*.log
*.nav
*.out
*.snm
*.toc
*.tex
_minted*
svg-inkscape*
*-svg.pdf
\ No newline at end of file
image: alpine:latest
pages:
stage: deploy
script:
- echo 'Nothin to do ...'
artifacts:
paths:
- public
only:
- master
PATH_LOCAL=~/public_html/PITCHME/
PATH_BIN=../bin/
PATH_ASSETS=../assets/
sync_local: PITCHME.md
mkdir -p $(PATH_LOCAL)/assets/md/img/
cp PITCHME.md $(PATH_LOCAL)/assets/md/PITCHME.md
cp $(PATH_ASSETS)/img/* $(PATH_LOCAL)/assets/img/
$(PATH_LOCAL)/assets/md/PITCHME.md: PITCHME.md
sed 's|https://rawgit.com/alegrand/RR_MOOC/master/||g' < $< > $@
C028AL_slides_module1-en-gz.pdf: slides_module1.pdf
mv $< $@
C028AL_slides_module1-fr-gz.pdf: diapos_module1.pdf
mv $< $@
%-gz.pdf: %.pdf
gzprez $<
%.pdf: %.tex
pdflatex --shell-escape $^
pdflatex --shell-escape $^
%.tex: %.org
emacs -batch $^ --funcall org-beamer-export-to-latex
# sed -i -e 's|includegraphics\(.*\)../assets/img/|includegraphics\1../assets/img/thumbnail/|' -e 's/\.png}/.jpg}/i' -e 's/\.JPG}/.jpg}/i' $@
#+TITLE: Les diapos du module 1
#+AUTHOR: @@latex:{\large Christophe Pouzat} \\ \vspace{0.2cm}MAP5, Paris-Descartes University and CNRS\\ \vspace{0.2cm} \texttt{christophe.pouzat@parisdescartes.fr}@@
#+OPTIONS: H:2 tags:nil
#+EXCLUDE_TAGS: noexport
#+LANGUAGE: fr
#+SELECT_TAGS: export
#+LATEX_CLASS: beamer
#+LATEX_CLASS_OPTIONS: [presentation,bigger]
#+LATEX_HEADER: \usepackage[normalem]{ulem}
#+BEAMER_HEADER: \setbeamercovered{invisible}
#+BEAMER_HEADER: \AtBeginSection[]{\begin{frame}<beamer>\frametitle{Où en sommes nous ?}\tableofcontents[currentsection]\end{frame}}
#+BEAMER_HEADER: \beamertemplatenavigationsymbolsempty
#+STARTUP: beamer
#+COLUMNS: %45ITEM %10BEAMER_ENV(Env) %10BEAMER_ACT(Act) %4BEAMER_COL(Col) %8BEAMER_OPT(Opt)
#+STARTUP: indent
#+PROPERTY: header-args :eval no-export
* M1-S0: Cahiers de notes / cahiers de laboratoire
:PROPERTIES:
:CUSTOM_ID: c028al-w1-s0
:END:
** Les grandes lignes du module : cahier de notes / cahier de laboratoire
:PROPERTIES:
:CUSTOM_ID: les-grandes-lignes-du-module-cahier-de-notes-cahier-de-laboratoire
:END:
1. Nous utilisons tous des cahiers de notes
2. Un aperçu historique de la prise de notes
3. Du fichier texte au langage de balisage léger
- Démonstration : markdown
4. Pérennité et évolutivité des notes avec la gestion de version
- Démonstration : gitlab
5. Les étiquettes et les logiciels d'indexation pour s'y retrouver
- Démonstration : DocFetcher
#+BEGIN_COMMENT
*Première ligne* Nous allons discuter ici d'une question qui
dépasse la problématique de la recherche reproductible.
En effet, la mise en œuvre concrète de la recherche reproductible
nécessite la tenue d'un cahier de notes et la prise de notes concerne
tout le monde. Je commencerai donc ce module en vous disant quelque
chose que vous savez déjà (!) : nous devons tous prendre des notes.
*Deuxième ligne* Si nous devons tous prendre des notes, nos
prédécesseurs ont du le faire aussi. Cette constatation élémentaire
faite, nous éviterons de croire que nous sommes les premiers à avoir à
faire face un déluge d'informations. Nous en profiterons pour apprendre
comment nos brillants ancêtres s'y sont pris.
En nous inspirant de nos connaissances des « anciennes » techniques,
nous verrons ensuite comment mettre à profit les outils fournis par
l'informatique.
*Troisième ligne* Les fichiers texte et les langages de balisage léger
font nous permettre de structurer nos notes et de les « recycler »
facilement (dans des articles, des pages web, etc.).
*Quatrième ligne* La gestion de version nous évitera de tout perdre tout
en gardant traces de nos corrections et modifications successives.
*Cinquième ligne* Enfin, reprendre une activité de zéro parce que
retrouver la bonne information dans la jungle de nos notes prendrait
plus de temps ne sera plus qu'un souvenir avec la construction d'index.
#+END_COMMENT
* M1-S1: Nous utilisons tous des cahiers de notes
:PROPERTIES:
:CUSTOM_ID: c028al-w1-s1
:END:
** 1. Cahier de notes / cahier de laboratoire
:PROPERTIES:
:CUSTOM_ID: cahier-de-notes-cahier-de-laboratoire
:END:
1. *Nous utilisons tous des cahiers de notes*
2. Un aperçu historique de la prise de notes
3. Du fichier texte au langage de balisage léger
- Démonstration : markdown
4. Pérennité et évolutivité des notes avec la gestion de version
- Démonstration : gitlab
5. Les étiquettes et les logiciels d'indexation pour s'y retrouver
- Démonstration : DocFetcher
#+BEGIN_COMMENT
La recherche reproductible est encore -- mais pour peu de temps
seulement ! --, une activité dont le nombre d'adeptes est restreint.
Elle suppose par contre une prise de notes « rigoureuse » et là, notre
propos commence à s'adresser à un groupe beaucoup plus large. C'est ce
que nous allons illustrer ici par quelques exemples.
#+END_COMMENT
** L'érudit qui annote son livre / manuscrit
:PROPERTIES:
:CUSTOM_ID: lérudit-qui-annote-son-livre-manuscrit
:END:
[[file:img/ManuscritAnnoteEtCoupe.png]]
Manuscrit d'œuvres d'Aristoteles (XIVe siècle).
#+BEGIN_COMMENT
Nous voyons ici un manuscrit du XIVe abondamment annoté par son
propriétaire Nicasius de Planca. Cette forme de prise de note est
extrêmement fréquente aussi bien à l'époque des manuscrits
qu'aujourd'hui. Vous devriez néanmoins éviter de l'employer sur des
livres empruntés dans une bibliothèque ou à des amis !
Les deux pages suivantes présentent un exemple d'une importance
considérable pour l'histoire des sciences.
#+END_COMMENT
** Galilée qui observe les lunes de Jupiter
:PROPERTIES:
:CUSTOM_ID: galilée-qui-observe-les-lunes-de-jupiter
:END:
[[file:img/GalileoManuscriptCoupe.png]]
#+BEGIN_COMMENT
Le 7 janvier 1610, Galilée fait une découverte capitale : il remarque
trois « petites étoiles » à côté de Jupiter. Après quelques nuits
d'observation, il découvre qu'il y en a une quatrième et qu'*elles
accompagnent la planète*, c'est ce qu'il note sur son cahier
d'observations. Ce sont les satellites visibles de Jupiter, qu'il
nommera plus tard les étoiles Médicées ou astres médicéens -- en
l'honneur de ses protecteurs, la Famille des Médicis -- et qui sont
aujourd'hui appelés lunes galiléennes.
#+END_COMMENT
**
[[file:img/GalileoManuscriptZoom.png]]
#+BEGIN_COMMENT
Ces observations amèneront Galilée à rejeter l'hypothèse
géocentrique (la terre est le centre de l'Univers et tout tourne autour
d'elle) en faveur du système copernicien héliocentrique. Cela l'amènera
indirectement (je « fais court ») et bien plus tard, le 22 juin 1633, a
être condamné par l'inquisition, ce qui lui vaudra de finir ses jours en
résidence surveillée.
#+END_COMMENT
** Les armoires à notes de Placcius et Leibniz
:PROPERTIES:
:CUSTOM_ID: les-armoires-à-notes-de-placcius-et-leibniz
:END:
[[file:img/Placcius_cabinet_TabIV.png]]
#+BEGIN_COMMENT
Avec l'apparition de l'imprimerie, la demande de papier croît
considérablement et le prix de celui-ci chute. En plus de l'emploi des
codex avec support papier que nous venons de voir, de nombreux savants
commencent à prendre leurs notes sur des « bouts de papier » qui
deviendront plus tard des fiches.
Mais si prendre des notes en abondance sur des « bouts de papier », est
très bien ! encore faut-il être capable de s'y retrouver. Vincent
Placcius (1642-1699) et Gottfried Leibniz (1646-1716) s'étaient fait
construire une armoire spéciale pour résoudre ce problème.
#+END_COMMENT
**
#+ATTR_LATEX: :width 0.3\textwidth
[[file:img/Placcius_cabinet_TabIVzoom.png]]
#+BEGIN_COMMENT
Cette armoire contenait une multitude de colonnes capables de
tourner autour de leur axe. Un côté de la colonne permettait d'inscrire
un ou des mots clés et le côté opposé comportait un crochet auquel était
attaché les notes correspondantes.
Remarquez l'avantage des « bouts de papiers classés » de Placcius et
Leibniz sur le /codex/ de Galilée : les premiers peuvent être facilement
réordonnées.
#+END_COMMENT
** Les dangers de l'abondance de notes : la triste fin de Fulgence Tapir
:PROPERTIES:
:CUSTOM_ID: les-dangers-de-labondance-de-notes-la-triste-fin-de-fulgence-tapir
:END:
Un extrait de la fin de la préface de « L'île des pingouins » d'Anatole
France, publié en 1908.
[[file:img/A_France_Pingouins.jpg]]
#+BEGIN_COMMENT
Je ne résiste pas, pour vous prévenir contre une accumulation exagérée
de notes, à vous lire un extrait du roman d'Anatole France « L'île des
pingouins », une histoire parodique de la France. Dans la préface, le
narrateur explique qu'il écrit l'histoire des Pingouins et que sa quête
d'informations l'amène chez l'immense savant Fulgence Tapir. Cette
visite va se solder par une catastrophe que le narrateur rapporte
ainsi :
Les murs du cabinet de travail, le plancher, le plafond même portaient
des liasses débordantes, des cartons démesurément gonflés, des boîtes où
se pressait une multitude innombrable de fiches, et je contemplai avec
une admiration mêlée de terreur les cataractes de l'érudition prêtes à
se rompre.
---Maître, fis-je d'une voix émue, j'ai recours à votre bonté et à votre
savoir, tous deux inépuisables. Ne consentiriez-vous pas à me guider
dans mes recherches ardues sur les origines de l'art pingouin?
---Monsieur, me répondit le maître, je possède tout l'art, vous
m'entendez, tout l'art sur fiches classées alphabétiquement et par ordre
de matières. Je me fais un devoir de mettre à votre disposition ce qui
s'y rapporte aux Pingouins. Montez à cette échelle et tirez cette boîte
que vous voyez là-haut. Vous y trouverez tout ce dont vous avez besoin.
J'obéis en tremblant. Mais à peine avais-je ouvert la fatale boîte que
des fiches bleues s'en échappèrent et, glissant entre mes doigts,
commencèrent à pleuvoir. Presque aussitôt, par sympathie, les boîtes
voisines s'ouvrirent et il en coula des ruisseaux de fiches roses,
vertes et blanches, et de proche en proche, de toutes les boîtes les
fiches diversement colorées se répandirent en murmurant comme, en avril,
les cascades sur le flanc des montagnes. En une minute elles couvrirent
le plancher d'une couche épaisse de papier. Jaillissant de leurs
inépuisables réservoirs avec un mugissement sans cesse grossi, elles
précipitaient de seconde en seconde leur chute torrentielle. Baigné
jusqu'aux genoux, Fulgence Tapir, d'un nez attentif, observait le
cataclysme; il en reconnut la cause et pâlit d'épouvante.
---Que d'art! s'écria-t-il.
Je l'appelai, je me penchai pour l'aider à gravir l'échelle qui pliait
sous l'averse. Il était trop tard. Maintenant, accablé, désespéré,
lamentable, ayant perdu sa calotte de velours et ses lunettes d'or, il
opposait en vain ses bras courts au flot qui lui montait jusqu'aux
aisselles. Soudain une trombe effroyable de fiches s'éleva,
l'enveloppant d'un tourbillon gigantesque. Je vis durant l'espace d'une
seconde dans le gouffre le crâne poli du savant et ses petites mains
grasses, puis l'abîme se referma, et le déluge se répandit sur le
silence et l'immobilité. Menacé moi-même d'être englouti avec mon
échelle, je m'enfuis à travers le plus haut carreau de la croisée.
#+END_COMMENT
** Le Navigateur et son livre de bord : Éric Tabarly
:PROPERTIES:
:CUSTOM_ID: le-navigateur-et-son-livre-de-bord-éric-tabarly
:END:
[[file:img/LivredebordpenduickV.jpg]]
#+BEGIN_COMMENT
Ici, un cas en apparence plus anecdotique : le livre de bord
d'Éric Tabarly lors de la trans-Pacifique de San-Francisco à Tokyo en
1969.
#+END_COMMENT
**
[[file:img/LivredebordpenduickVzoom1.png]]
#+BEGIN_COMMENT
Tabarly y note les événements « marquant ». Par exemple, le 21
mars à 23 h, le foc ballon est déchiré.
#+END_COMMENT
**
[[file:img/LivredebordpenduickVzoom2.png]]
#+BEGIN_COMMENT
Sur la page opposé il fait ses calculs de positions (il n'y avait
pas de GPS à l'époque).
*Le cas du livre de bord n'est anecdotique qu'en apparence*.
Un projet européen a, en effet, été consacré, il y a une dizaine
d'année, à une reconstruction des climats des océans atlantiques et
indiens aux 17e et 18e siècles. Cette tentative de reconstruction s'est
basée sur des /livre de bord/ des navires des compagnies des Indes
portugaises, espagnoles, hollandaises, anglaises et françaises.
De même, les livres de bord des « navires négriers » constituent une
source d'information capitale pour l'estimation du nombre d'africains
déportés vers les colonies de ce que les occidentaux désignaient par
« Nouveau Monde » du 15e au 19e siècle (11 à 12 millions).
#+END_COMMENT
** Quel(s) support(s) matériel(s) pour les notes ?
:PROPERTIES:
:CUSTOM_ID: quels-supports-matériels-pour-les-notes
:END:
Doit-on utiliser :
- l'objet d'étude (comme pour le livre annoté)
- un ou des cahiers
- des fiches ou feuilles volantes stockées dans un classeur
- un ou des fichiers d'ordinateur
- des dessins ou photos
- des films
- ... ?
** Comment s'y retrouver ?
:PROPERTIES:
:CUSTOM_ID: comment-sy-retrouver
:END:
Les notes posent un problème d'organisation :
- Comment peut-on imposer une structure à nos notes après coup ? Est-ce
seulement possible ?
- Peut-on les indexer, si oui, comment ?
- Comment peut-on les rendre pérennes tout en les faisant évoluer ?
#+BEGIN_COMMENT
*En Introduction* Les notes par nature disparates -- par les
sujets dont elles traitent et, souvent, par leurs supports matériels --
posent un problème d'organisation.
*En conclusion* *Il est clair que sans organisation, l'utilité des notes
n'excède qu'à peine notre capacité à mémoriser des faits ou évènements.*
Dans le reste de ce module nous allons /proposer/ des réponses aux
questions que nous venons de poser dans ces deux dernières diapos.
#+END_COMMENT
* M1-S2: Un aperçu historique de la prise de notes
:PROPERTIES:
:CUSTOM_ID: c028al-w1-s2
:END:
** 1. Cahier de notes / cahier de laboratoire
:PROPERTIES:
:CUSTOM_ID: cahier-de-notes-cahier-de-laboratoire-1
:END:
1. Nous utilisons tous des cahiers de notes
2. *Un aperçu historique de la prise de notes*
3. Du fichier texte au langage de balisage léger
- Démonstration : markdown
4. Pérennité et évolutivité des notes avec la gestion de version
- Démonstration : gitlab
5. Les étiquettes et les logiciels d'indexation pour s'y retrouver
- Démonstration : DocFetcher
#+BEGIN_COMMENT
Si nous devons tous prendre des notes, nos prédécesseurs ont dû le
faire aussi. Cette constatation élémentaire va nous inciter à regarder
comment nos brillants ancêtres s'y sont pris pour effectuer cette tâche.
#+END_COMMENT
** De quoi allons-nous discuter ?
:PROPERTIES:
:CUSTOM_ID: de-quoi-allons-nous-discuter
:END:
- de l'aspect concret de la prise de note -- la « matérialité » des
historiens --
- de l'organisation des livres et des notes
- du lien entre aspects matériels et organisationnels.
#+BEGIN_COMMENT
Notre discussion va porter en partie sur le livre puisque les éléments
de navigation de ce dernier : table des matières, index, etc. ;
s'applique aussi à l'organisation des notes.
Nous allons nous concentrer sur le « côté occidental » de l'histoire
avec une seule page consacrée aux contributions chinoises et aucune aux
contributions musulmanes, indiennes ou précolombiennes. Ce biais doit
être interprété comme un reflet de mes ignorances et par la plus grande
facilité d'obtenir des documents et illustrations concernant l'histoire
du livre et de la prise de notes en Occident.
#+END_COMMENT
** L'aspect matériel résumé sur une diapo
:PROPERTIES:
:CUSTOM_ID: laspect-matériel-résumé-sur-une-diapo
:END:
[[file:img/Figure_W1_S2_1.jpg]]
#+BEGIN_COMMENT
En haut à gauche : une tablette d'argile avec des comptes
(précunéiforme, vers -3000)
En haut au milieu : une fresque de Pompéi avec le portrait de Terentius
Neo et sa femme. Elle porte une /tablette de cire/ et un /stylet/ (les
outils principaux de prise de notes jusqu'au 19e siècle, ou presque), il
porte un /volumen/, la support matériel du livre jusqu'au début de notre
ère.
En haut à droite : un cahier de notes sur papier datant du milieu du 17e
siècle et contenant des « lieux communs » au sens rhétorique du terme de
« source générale communément admise d'où un orateur peut tirer ses
arguments ».
En bas à gauche : une fiche, exemple d'un support de notes dont
l'utilisation va « exploser » avec la bureaucratisation et le
développement des bibliothèques. Ce support sera largement adopté dans
les sciences humaines, mais il a d'abord été systématiquement employé et
peut être même créé par le naturaliste Carl Linné, père de la
/taxinomie/.
En bas au milieu : des « Post-it » comme nous sommes nombreux à en
utiliser tous les jours.
En bas à droite : un ordinateur moderne utilisable comme une tablette
(numérique cette fois).
#+END_COMMENT
** Tablette de cire et stylet
:PROPERTIES:
:CUSTOM_ID: tablette-de-cire-et-stylet
:END:
[[file:img/tabula_stilus.jpg]]
#+BEGIN_COMMENT
Les tablettes de cire (en latin tabulæ, planches) sont des supports
d'écriture effaçables et réutilisables, connus depuis la haute Antiquité
et qui ont été utilisés jusqu'au milieu du XIXe siècle.
La tablette de cire est formée d'une plaquette le plus souvent en bois
(mais les nobles auront des tablettes en argent, ivoire, etc.). Elle est
évidée sur presque toute sa surface en conservant un rebord de quelques
millimètres qui fait cadre. De la cire est coulée dans la partie en
dépression puis lissée. L'écriture se fait en gravant les caractères sur
la cire à l'aide de l'extrémité pointue d'un instrument appelé style ou
stylet. Ils peuvent être effacés en lissant la cire avec l'autre
extrémité, plate, du stylet, après l'avoir ramollie.
La plus ancienne tablette connue provient d'un bateau mycénien et date
du XIVe siècle av. J.-C. Les Grecs ont adopté la tablette par
l'intermédiaire des Phéniciens en même temps que l'alphabet vers le
VIIIe siècle av. J.-C..
En français l'expression « faire table rase » vient du latin /tabula
rasa/, effacer la tablette.
Les ardoises et des tablettes de sable ont également été utilisées pour
prendre des notes.
#+END_COMMENT
** Du /volumen/ au /codex/
:PROPERTIES:
:CUSTOM_ID: du-volumen-au-codex
:END:
[[file:img/Figure_W1_S2_3.jpg]]
#+BEGIN_COMMENT
Le passage du /volumen/ au /codex/ est absolument fondamentale pour
l'avenir de la civilisation écrite.
Le /volumen/ est un livre à base de feuilles de papyrus collées les unes
aux autres et qui s'enroule sur lui-même. Il a été créé en Égypte vers
3000 av. J.-C. Le texte est rédigé en colonnes parallèles assez
étroites. C'est le support du texte par excellence durant les trente
siècles précédant notre ère, d'abord en Égypte, puis dans tout le monde
méditerranéen.
La mosaïque en bas à gauche représente Virgile (70-19 avant J.-C.,
assis) tenant un volume de l'Énéide et Clio, muse de l'Histoire, tenant
elle aussi un /volumen/.
Comme l'explique Frédéric Barbier : « La forme du /volumen/ impose une
pratique de lecture complexe : il faut dérouler (/explicare/) et
enrouler en même temps, ce qui interdit par exemple, de travailler
simultanément sur plusieurs rouleaux (un texte et son commentaire) ou de
prendre des notes, impose une lecture suivie et empêche la simple
consultation. »
Le /volumen/ n'est clairement pas adapté à une lecture « nomade » ;
imagine-t-on Ulysse partant pour son Odyssée avec les 24 /volumen/ de
l'Iliade ?
Le /volumen/ est à l'origine du terme « volume » dans un « livre en
plusieurs volumes » comme dans la désignation du concept géométrique.
Le passage au codex repose sur deux innovations : - la collection des
tablettes de cires en « groupes reliés » ; - la généralisation du
parchemin (peau, généralement, de mouton spécialement préparée) au
détriment du papyrus. Cette généralisation résulte une lutte pour
l'hégémonie culturelle entre deux descendants de généraux d'Alexandre le
Grand, en effet d'après Pline l'ancien : Ptolémé Épiphane d'Alexandrie
cherchait à empêcher Eumène II d'établir une bibliothèque à Pergame (au
2e siècle avant J.-C.) et avait interdit l'exportation du papyrus
(produit exclusivement en Égypte), ce qui incita Eumène à chercher un
substitut qui devint le parchemin.
Le remplacement du rouleau par le codex aura des conséquences majeures
sur l'organisation du livre ainsi que sur la façon de lire et il
permettra le développement ultérieur de l'imprimerie.
La principale révolution introduite par le codex est la notion de page.
Grâce à elle, le lecteur peut accéder de manière directe à un chapitre
ou à un passage du texte, alors que le rouleau impose une lecture
continue. *Les mots ne sont de plus pas séparés par des espaces*. Comme
l'écrit Collette Sirat : « Il faudra vingt siècles pour qu'on se rende
compte que l'importance primordiale du codex pour notre civilisation a
été de permettre la lecture sélective et non pas continue, contribuant
ainsi à l'élaboration de structures mentales où le texte est dissocié de
la parole et de son rythme. »
Remarquez les lettres en rouge, résultat de la /rubrication/ (mot qui a
donné notre « rubrique » moderne) utilisée pour séparer ce qui deviendra
des paragraphes avec l'imprimerie. Cette dernière en effet utilisera des
espaces blancs plutôt que des couleurs (trop chères) pour marquer des
séparations. L'usage de la couleur constitue une technique de mise en
page qui pourrait parfaitement être remise à l'ordre du jour avec
l'informatique.
#+END_COMMENT
** Eusèbe et les références croisées
:PROPERTIES:
:CUSTOM_ID: eusèbe-et-les-références-croisées
:END:
[[file:img/Eusebe_final.jpg]]
#+BEGIN_COMMENT
Au IVe siècle de notre ère, Eusèbe de Césarée ou Eusèbe (de) Pamphile
est l'auteur de nombreuses œuvres historiques, apologétiques, bibliques
et exégétiques. Auteur de l'Histoire ecclésiastique, il est reconnu
comme un Père de l'Église, et ses écrits historiques ont une importance
capitale pour la connaissance des trois premiers siècles de l'histoire
chrétienne. Il va apporter plusieurs innovations capitales à
l'organisation du livre dont la table de références croisées.
#+END_COMMENT
** Canon eusébien
:PROPERTIES:
:CUSTOM_ID: canon-eusébien
:END:
[[file:img/Evangeliaire_Lorsch.jpg]]
#+BEGIN_COMMENT
Pour permettre une comparaison plus facile des quatre évangiles, il
numérote les différents versets de chacun d'entre eux -- sa numérotation
n'est celle employée de nos jours qui, elle, date du XVIe siècle. Il
indique les versets dont les contenus sont identiques dans les 4
évangiles (à gauche), ceux dont le contenu est identique dans 3 des 4 (à
droite), dans 2 des 4, etc. Ce « canon eusébien » constitue le premier
exemple connu de références croisées.
#+END_COMMENT
** Importance du /codex/
:PROPERTIES:
:CUSTOM_ID: importance-du-codex
:END:
D'après Frédéric Barbier dans l'« Histoire du livre » :
- L'invention du /codex/ est absolument fondamentale pour l'avenir de la
civilisation écrite
- Le /codex/ se prête à la /consultation partielle/
- On peut lui superposer un système de références facilitant la
consultation
- On peut consulter le /codex/ en prenant des notes
- La combinaison du /codex/ et de la minuscule donne un outil
intellectuel très puissant, tel qu'il n'en existait pas
antérieurement.
#+BEGIN_COMMENT
Au fil des siècles, le codex --- qu'on désigne le plus souvent comme un
manuscrit --- va évoluer et se donner peu à peu les attributs du livre
moderne : séparation entre les mots (VIIe siècle), début de ponctuation
(VIIIe siècle), table des matières, titre courant, marque de paragraphe
(XIe siècle), pagination, index (XIIIe siècle), etc.
Un point intéressant : le contenu de la Thora est « fixé » avant
l'apparition du codex et, aujourd'hui encore, la Thora est écrite sur
des /volumen/ (dans les synagogues au moins). La religion chrétienne se
développe en même temps que le codex et ne donnera jamais au /volumen/
un statut « supérieur », pas plus que ne le fera la religion musulmane.
#+END_COMMENT
** Parallèle chinois
:PROPERTIES:
:CUSTOM_ID: parallèle-chinois
:END:
[[file:img/Figure_W1_S2_6.jpg]]
#+BEGIN_COMMENT
Le lien entre apparition et généralisation du /codex/, d'une part, et
apparition des « outils de navigation », table des matières, index,
titre courant etc., d'autre part à un pendant dans la civilisation
chinoise.
En Chine, les concours d'entrée dans l'administration se développent au
9e siècle. L'épreuve principale de ceux-ci serait probablement appelée
épreuve de culture générale de nos jours et demande aux candidat une
connaissance approfondie des classiques, Confucius en tête, et la
capacité de les citer.
Pour répondre à cette demande, des ouvrages spécialisés, sorte de
florilèges, les leishu, vont se développer. Mais leur utilisation
efficace doit permettre de trouver un ensemble de citations appropriées
à un contexte donné suppose l'emploi d'index, de table des matières,
etc. De façon intéressante, le /codex/ et les outils de navigation vont
eux aussi se développer *de concert* à partir de cette époque.
La majorité de ces leishus *est imprimée* (dès le 9e siècle !), ce que
rappelle la matrice d'impression à droite de la page. L'impression se
fait bien sûr sur du papier, support inventé par les Chinois au 8e
siècle avant J.-C....
#+END_COMMENT
** Organiser en « mettant dans la bonne case »
:PROPERTIES:
:CUSTOM_ID: organiser-en-mettant-dans-la-bonne-case
:END:
[[file:img/Placcius_cabinet_TabIV.png]]
#+BEGIN_COMMENT
Maintenant que nous avons très brièvement décrit l'apparition des
principaux outils de navigations du livre -- outils qui peuvent bien
entendu s'appliquer aux notes prises dans un cahier -- ; nous revenons
sur le « bout de papier » ou la fiche comme support de note.
Nous montrons à nouveau l'armoire à notes de Placcius et Leibniz
puisqu'elle évoque parfaitement les inconvénients et les avantages des
supports ne contenant *qu'une seule note*.
L'inconvénient est que le bout de papier ou la fiche se perdent
facilement et ne servent à rien s'ils ne sont pas *classés* en plus
d'être rangés. Problème résolu par l'armoire de la figure. D'une
certaine façon, sa conception fait qu'on accède à son contenu par
l'index.
L'avantage est que les notes peuvent être réorganisées si elles
contiennent des information sur plusieurs sujets. Elle peuvent aussi
être directement collées dans un livre lors de la composition d'un
florilège ou d'un ouvrage de synthèse.
Ce dernier procédé était très couramment employé par les humanistes et
les érudit de la renaissance et du début de la période moderne.
[[https://fr.wikipedia.org/wiki/Conrad_Gessner][Conrad Gessner]]
(1516-1565) était un champion de cette technique ; il obtenait même
parfois ses fiches en découpant les pages des livres. Encore une fois,
ne faites pas cela avec les livres de bibliothèques !
#+END_COMMENT
** Organiser avec une bonne « carte » : la méthode de John Locke
:PROPERTIES:
:CUSTOM_ID: organiser-avec-une-bonne-carte-la-méthode-de-john-locke
:END:
[[file:img/MethodeLocke1.jpg]]
#+BEGIN_COMMENT
Nous allons maintenant apprendre une technique de construction d'index
due à [[https://fr.wikipedia.org/wiki/John_Locke][John Locke]]
(1632-1704), grand-père du libéralisme, ce qui ne l'empêchait pas d'être
actionnaire de la /Royal African Company/,
[[https://en.wikipedia.org/wiki/John_Locke#Constitution_of_Carolina][principale
compagnie négrière anglaise]]...
J'illustre la méthode avec mon cahier de notes. Les deux pages décrivent
l'organisation d'un jeu de données dans un fichier au format
[[https://www.hdfgroup.org/][HDF5]] sur la page de gauche et
l'organisation correspondante dans un =data frame= du logiciel
[[https://www.r-project.org/][R]] sur la page de droite. Les données
concernent la mesure de la concentration des ions calcium dans des
neurones et ces notes ont été prises lors du développement d'un code
(programme d'ordinateur) pour les analyser.
Pour l'application de la méthode de Locke, ce n'est pas le contenu des
pages qui nous importent directement, mais les fait qu'elles sont
numérotées (en bas dans les coins externes, ici nous avons affaire aux
pages 86 et 87) et qu'elles comportent des mots clé : =code= ; =neuro= ;
=calcium= ; inscrits en rouge en bas des pages.
Je signale que la méthode de Locke peut être mise en œuvre après coup.
Je l'ai en fait testée lors de la préparation de ce cours, c'est-à-dire
après avoir commencé à remplir mon cahier de notes.
#+END_COMMENT
** La méthode de John Locke (suite)
:PROPERTIES:
:CUSTOM_ID: la-méthode-de-john-locke-suite
:END:
[[file:img/MethodeLocke2.jpg]]
#+BEGIN_COMMENT
Nous voyons maintenant notre index. Il est situé en fin de cahier, même
si Locke recommande de le placer au début, parce-que je ne l'avais pas
planifié comme je viens de l'expliquer.
L'idée est de référencer les mots clé du cahier en se basant sur leur
première lettre et sur la première voyelle suivant la première lettre.
L'index est ainsi décomposé en 26 entrées principales, les lettres
capitales de A à R visibles sur les deux pages, et chaque entrée
principale est elle-même subdivisée suivant les 5 voyelles les plus
courantes (par convention le y sera alors classé avec le i).
Les pages 86 et 87 que nous venons de voir comportaient le mot clé
=code= et nous voyons qu'elles figurent sur la ligne =Co=, elle
comportaient le mot clé =neurone= et elles figurent également sur la
ligne =Ne= ; enfin elle comportaient le mot clé =calcium= et figurent
donc sur la ligne =Ca=.
Si besoin, on peut aussi lister les mots clé avant ou après l'index
lorsque le cahier est fini.
#+END_COMMENT
** Conclusions
:PROPERTIES:
:CUSTOM_ID: conclusions
:END:
- Comme il est rarement possible de se passer complètement d'un support
papier, apprendre de nos brillants prédécesseurs devrait nous
permettre de ne pas « réinventer la roue »
- Clairement nous avons néanmoins intérêt à utiliser autant que possible
un support numérique pour profiter (en nous inspirant de ces mêmes
prédécesseurs) :
- d'une plus grande flexibilité d'organisation, de réorganisation et
de structuration
- d'outils d'archivage fiables
- d'outils d'indexation puissants.
* M1-S3: Du fichier texte au langage de balisage léger
:PROPERTIES:
:CUSTOM_ID: c028al-w1-s3
:END:
** 1. Cahier de notes / cahier de laboratoire
:PROPERTIES:
:CUSTOM_ID: cahier-de-notes-cahier-de-laboratoire-2
:END:
1. Nous utilisons tous des cahiers de notes
2. Un aperçu historique de la prise de notes
3. *Du fichier texte au langage de balisage léger*
- Démonstration : markdown
4. Pérennité et évolutivité des notes avec la gestion de version
- Démonstration : gitlab
5. Les étiquettes et les logiciels d'indexation pour s'y retrouver
- Démonstration : DocFetcher
#+BEGIN_COMMENT
Nous commençons à présent une discussion plus « technique » dirigée
principalement vers les outils que l'informatique met à notre
disposition pour prendre des notes avec les notions de « fichier texte »
et de « langage de balisage léger ».
#+END_COMMENT
** Qu'est-ce qu'un fichier texte ?
:PROPERTIES:
:CUSTOM_ID: quest-ce-quun-fichier-texte
:END:
- De façon pratique, un
« [[https://fr.wikipedia.org/wiki/Fichier_texte][fichier texte]] »
/donne quelque chose de lisible/ lorsqu'il est ouvert avec un
[[https://fr.wikipedia.org/wiki/%C3%89diteur_de_texte][éditeur de
texte]].
- Un « éditeur de texte » permet de créer et de modifier des fichiers
textes (belle définition circulaire !) :
- [[https://notepad-plus-plus.org/][Notepad++]] pour =Windows=
- [[https://wiki.gnome.org/Apps/Gedit][gedit]] pour les systèmes
=Unix / Linux= (mais pas seulement)
- [[https://en.wikipedia.org/wiki/TextEdit][TextEdit]] pour les
=MacOS=.
#+BEGIN_COMMENT
Nous ne citons ici, délibérément, que des logiciels libres (il est
difficile de faire de la recherche vraiment reproductible avec des
logiciels non libres).
Un logiciel de
« [[https://fr.wikipedia.org/wiki/Traitement_de_texte][traitement de
texte]] » est plus sophistiqué qu'un simple éditeur de texte ; il permet
de faire plus, ce qui sous entend qu'il peut aussi ouvrir et manipuler
des fichiers textes.
*Attention* : le format « natif » des traitements de texte est rarement
un format texte. Les fichiers =doc= et =docx= de =Word= et =odt= de
=LibreOffice= /ne sont pas des fichiers textes/.
#+END_COMMENT
** Un fichier « non lisible » avec un éditeur de texte
:PROPERTIES:
:CUSTOM_ID: un-fichier-non-lisible-avec-un-éditeur-de-texte
:END:
[[file:img/Exemple_Fichier_Binaire.png]]
Un fichier =PDF= ouvert avec =gedit=
** Un fichier « texte » ouvert avec un éditeur de texte
:PROPERTIES:
:CUSTOM_ID: un-fichier-texte-ouvert-avec-un-éditeur-de-texte
:END:
[[file:img/Exemple_Fichier_Texte.png]]
** Pourquoi utiliser des fichiers texte ?
:PROPERTIES:
:CUSTOM_ID: pourquoi-utiliser-des-fichiers-texte
:END:
Les caractères contenus dans le fichier texte sont typiquement codés en
[[https://fr.wikipedia.org/wiki/UTF-8][UTF-8]] (/Universal Character Set
Transformation Format - 8 bits/).
*Cela implique que* :
- il est /toujours possible/ de les lire avec un éditeur de texte /même
des années plus tard/
- les logiciels d'indexation ou de
« [[https://en.wikipedia.org/wiki/Desktop_search][recherche de
bureau]] », comme les logiciels de
[[https://fr.wikipedia.org/wiki/Gestion_de_versions][gestion de
versions]], les exploitent pleinement.
*Conclusion : choisissez le format texte (UTF-8)*.
** Problème du fichier texte « simple »
:PROPERTIES:
:CUSTOM_ID: problème-du-fichier-texte-simple
:END:
- Avec un fichier texte « simple » il n'est pas possible de profiter des
outils de navigation comme les hyperliens.
- De même, il n'est pas possible de mettre en évidence un mot ou un
groupe de mots avec une police *grasse* ou une police /italique/.
- Si plusieurs personnes travaillent sur un même texte, elles ne peuvent
se corriger en +barrant+ des mots.
** Un fichier =HTML= visualisé avec un navigateur
:PROPERTIES:
:CUSTOM_ID: un-fichier-html-visualisé-avec-un-navigateur
:END:
[[file:img/Exemple_Rendu_HTML.png]]
#+BEGIN_COMMENT
Ces limitations, combinées aux avantages des fichiers textes, ont
amenées les informaticiens à développer des
[[https://fr.wikipedia.org/wiki/Langage_de_balisage][langages de
balisages]] (/Markup Language/ en anglais).
Un exemple banale est le
[[https://fr.wikipedia.org/wiki/Hypertext_Markup_Language][langageHTML]].
#+END_COMMENT
** Un fichier =HTML= visualisé avec un éditeur de texte
:PROPERTIES:
:CUSTOM_ID: un-fichier-html-visualisé-avec-un-éditeur-de-texte
:END:
[[file:img/Exemple_Source_HTML.png]]
#+BEGIN_COMMENT
Ces langages définissent une collection de balises qui ne sont pas
(typiquement) destinées à être lues par un humain, mais à être
interprétées par un logiciel.
Retrouvons le texte du début de la page précédente : « En informatique
les langages de balisage... ».
Remarquez la syntaxe qui permet d'introduire un commentaire dans le
fichier source. Un commentaire est un élément de texte qui ne sera pas
interprété par le logiciel de visualisation.
#+END_COMMENT
**
Le problème se résume ainsi :
- Fichiers texte attractifs pour la prise de notes.
- Langages de balisages $\Rightarrow$ meilleur confort de lecture des fichiers /avec
logiciel « de rendu »/.
- Langages de balisages $\Rightarrow$ fichiers source au format texte, *mais*
nécessitent éditeurs spécialisés.
Peut-on combiner la légèreté des fichiers textes « simples » avec le
confort de lecture offert par les langages de balisage ?
#+BEGIN_COMMENT
Le problème se résume ainsi :
- Les fichiers textes sont très attractifs pour la prise de notes.
- Les langages de balisages comme l'=HTML= nous permettent d'améliorer
considérablement le confort de lecture de nos fichiers /à condition
d'utiliser un logiciel « de rendu » adapté/.
- Les langages de balisages comme l'=HTML= génèrent des fichiers sources
au format texte, mais avec lesquels il est difficile (pénible) de
travailler et nécessitent des éditeurs spécialisés -- ce qui ralentit
l'écriture des notes --.
Peut-on combiner la légèreté des fichiers textes « simples » avec le
confort de lecture offert par les langages de balisage ?
#+END_COMMENT
** Langage de balisage léger : l'idée
:PROPERTIES:
:CUSTOM_ID: langage-de-balisage-léger-lidée
:END:
Un [[https://fr.wikipedia.org/wiki/Langage_de_balisage_l%C3%A9ger][langage de balisage léger]] est :
- un type de langage de balisage utilisant une /syntaxe simple/
- conçu pour qu'un fichier en ce langage soit /aisé à saisir/ avec un
éditeur de texte simple
- /facile à lire dans sa forme non formatée/, c'est-à-dire sans logiciel
dédié comme un navigateur internet.
** L'exemple de =Markdown=
:PROPERTIES:
:CUSTOM_ID: lexemple-de-markdown
:END:
[[file:img/Exemple_Markdown.png]]
Markdown source (en haut) et sortie HTML (en bas)
#+BEGIN_COMMENT
Markdown nous permet aussi de structurer facilement nos notes avec des
sections, sous-sections, etc.
Les hyperliens peuvent être aussi bien avoir des cibles externes, comme
illustré ici, qu'interne.
Il est possible d'inclure des commentaires.
#+END_COMMENT
** =Markdown= n'est pas le seul langage de balisage léger disponible
:PROPERTIES:
:CUSTOM_ID: markdown-nest-pas-le-seul-langage-de-balisage-léger-disponible
:END:
- Le plus communément employé est [[https://fr.wikipedia.org/wiki/Wikitexte][Wikitexte]] de Wikipédia
- [[http://www.methods.co.nz/asciidoc/][AsciiDoc]] a de nombreux adeptes
- [[http://docutils.sourceforge.net/docs/user/rst/quickstart.html][ReStructuredText]] est très employé par la communauté des programmeurs =Python=
- Il y en a bien d'autres.
** Conclusions
:PROPERTIES:
:CUSTOM_ID: conclusions-1
:END:
Les langages de balisage léger vont nous permettre de :
- travailler avec des fichiers textes
- écrire rapidement nos notes, avec n'importe quel éditeur, grâce à leur
syntaxe simplifiée
- organiser nos notes en les structurant.
#+BEGIN_COMMENT
Dans la partie approfondissements, nous montrons :
- comment obtenir n'importe quel format « de sortie » (=HTML=, =PDF=,
=docx=, =Wikitexte=) à partir d'un seul « fichier source » au format
=Markdown= ;
- que le langage de balisage léger choisi importe peu puisque nous
disposons d'un outil pour convertir l'un dans n'importe quel autre.
#+END_COMMENT
* M1-S4: Pérennité et évolutivité des notes avec la gestion de version
:PROPERTIES:
:CUSTOM_ID: c028al-w1-s4
:END:
** 1. Cahier de notes / cahier de laboratoire
:PROPERTIES:
:CUSTOM_ID: cahier-de-notes-cahier-de-laboratoire-3
:END:
1. Nous utilisons tous des cahiers de notes
2. Un aperçu historique de la prise de notes
3. Du fichier texte au langage de balisage léger
- Démonstration : markdown
4. *Pérennité et évolutivité des notes avec la gestion de version*
- Démonstration : gitlab
5. Les étiquettes et les logiciels d'indexation pour s'y retrouver
- Démonstration : DocFetcher
#+BEGIN_COMMENT
Nous allons maintenant discuter de la façon dont l'informatique nous
permet de conserver nos notes de façon « sûr » tout en nous permettant
de les faire évoluer.
Les outils dont nous allons parler concernent encore une fois une
communauté beaucoup plus large que celle de la « recherche
reproductible ». Toute personne amenée à « travailler » son texte s'y
trouve confrontée, cela d'autant plus que la rédaction est de plus en
plus effectuée en commun.
La problème de la pérennité des notes et des textes ne constitue en rien
une nouveauté.
Pour les humanistes et les savants du début de l'ère moderne qui se
spécialisaient dans la compilation de textes, elle était une véritable
obsession et la justification de leur travail.
La solution qu'ils préconisaient alors, la copie multiple, est identique
à celle que nous employons aujourd'hui, seul le support à changer.
Restons modestes, le support papier des humanistes a démontré sa
capacité à résister à l'épreuve du temps.
Par contre, en ce qui concerne l'évolutivité, nous avons quelques
raisons de penser que nos outils modernes constituent un véritable
progrès.
#+END_COMMENT
** L'évolutivité avec un support papier
:PROPERTIES:
:CUSTOM_ID: lévolutivité-avec-un-support-papier
:END:
#+ATTR_LATEX: :width 1.0\textwidth
[[file:img/Pierre_Ambroise_Choderlos_de_Laclos_Les_Liaisons_dangereuses.png]]
#+BEGIN_COMMENT
Ici, l'exemple du manuscrit des « Liaisons dangereuses » de Pierre
Ambroise Choderlos de Laclos.
L'auteur a apporté de nombreuses corrections à son manuscrit.
On conçoit que le nombre de corrections qu'il peut ainsi apporter est
relativement restreint.
#+END_COMMENT
** L'évolutivité avec traitement de texte
:PROPERTIES:
:CUSTOM_ID: lévolutivité-avec-traitement-de-texte
:END:
[[file:img/LibreOffice_notes_pour_CLOM_diff_origine.png]]
#+BEGIN_COMMENT
Une solution qui permet de travailler lorsqu'on utilise que des fichiers
texte est le suivi de modifications proposé par la plupart des logiciels
de traitement de texte.
Ce n'est pas la solution que nous préconisons, mais c'est certainement
le type de « gestion de version » auquel les utilisateurs d'ordinateurs
ont le plus de chances d'avoir été exposés.
Nous prenons ici un exemple avec =LibreOffice= où nous éditons un
fichier contenant des notes prises pour préparer ce cours.
Remarquez les boutons en bas à gauche que nous faisons apparaître en
navigant dans les menu /view/ puis /Toolbars/ avant de sélectionner
/track changes/.
- solution « facile » à mettre en œuvre
- pas de format texte
- faire attention à ne garder *que la dernière version* avant de
soumettre un article (pour les scientifiques)
- les sauvegardes doivent être gérées séparément.
#+END_COMMENT
** L'évolutivité avec un « moteur de wiki »
:PROPERTIES:
:CUSTOM_ID: lévolutivité-avec-un-moteur-de-wiki
:END:
[[file:img/Dokuwiki_notes_pour_CLOM.png]]
#+BEGIN_COMMENT
Une solution plus proche de l'esprit de ce cours est l'emploi d'un
/wiki/ pour gérer ses notes.
Ici, j'illustre l'usage d'un wiki personnel utilisant /DokuWiki/ comme
moteur de wiki, j'aurais aussi pu utiliser /MediaWiki/, le moteur de
Wikipédia.
/DokuWiki/ n'emploie que des fichiers texte.
Je l'ai appris lors de la préparation de ce cours, ce qui signifie qu'il
est assez simple à utiliser.
Encore une fois, les notes prises en préparation du cours sont utilisées
pour illustration.
#+END_COMMENT
**
[[file:img/Dokuwiki_notes_pour_CLOM_historique2.png]]
#+BEGIN_COMMENT
Si je clique sur « Derniers changements », alors je vois apparaître la
liste des pages de mon wiki avec les dates des dernières modifications.
Si maintenant je clique sur le nom de l'une des pages...
#+END_COMMENT
**
[[file:img/Dokuwiki_notes_pour_CLOM_diff.png]]
#+BEGIN_COMMENT
Je vois apparaître la différence entre la dernière version, à gauche, et
la version présente à droite.
Commenter plus...
Vous avez accès à des informations du même type sur n'importe quelle
page wikipédia.
#+END_COMMENT
** Avantages et inconvénients
:PROPERTIES:
:CUSTOM_ID: avantages-et-inconvénients
:END:
- solution qui a fait ses preuves, en particulier dans un cadre
collaboratif
- format texte (avec =DokuWiki=)
- ne permet de modifier qu'une seule page à la fois
** L'évolutivité avec la gestion de version
:PROPERTIES:
:CUSTOM_ID: lévolutivité-avec-la-gestion-de-version
:END:
[[file:img/Github_Module1.png]]
#+BEGIN_COMMENT
Je présente maintenant la solution la plus sophistiquée à ce jour.
Ici, un logiciel spécifique, /git/ est employé pour gérer les versions
successives d'un ensemble de fichiers de nature disparate (des fichiers
textes, des images, etc). En fait des arborescence de fichiers peuvent
être gérées par ce logiciel.
Les logiciels comme /git/ nécessite la création d'un dépôt, qui peut
être la machine de l'utilisateur, mais qui est en général hébergé sur un
site internet dédié comme ici /GitHub/.
Le dépôt va permettre à différentes personnes de travailler sur le même
« projet ». Elles vont échanger leur modifications via le dépôt. *Elles
auront néanmoins toutes une copie complète de ce dernier* (datant de
leur dernière « synchronisation »).
Des nombreux instituts de recherche fournissent maintenant de tels
dépôts aux laboratoires qui leurs sont rattachés.
Les utilisateurs peuvent alors souvent employer une interface graphique
pour naviguer dans leurs dépôts, revenir sur des version antérieures,
faire des comparaisons, des recherches, etc.
Nous voyons ici l'interface fourni par /GitHub/ et nous visualisons un
état antérieur du fichier source de cette présentation.
Vous pouvez tous vous connectez à /Github/, aller sur le dépôt que nous
avons utilisé pour préparer le cours, et refaire ce qui est montré dans
les quelques diapos qui suivent.
Si je clique sur le bouton /History/, je vois...
#+END_COMMENT
**
[[file:img/Github_Module1_historique.png]]
#+BEGIN_COMMENT
Encore une fois, la liste des modifications apportées au fichier avec le
nom de la personne ayant effectué ces modifications et les dates
associées.
Si maintenant je clique sur le numéro 5a2951f, je vois...
#+END_COMMENT
**
[[file:img/Github_Module1_diff.png]]
#+BEGIN_COMMENT
Les différences entre la version précédente et la version identifiée par
le numéro sur lequel j'ai cliqué.
Commentez...
#+END_COMMENT
**
[[file:img/Git_diff_mixte.png]]
#+BEGIN_COMMENT
Lorsque plusieurs fichiers ont été modifiés, comme ici où un fichier
image a été rajouté et un fichier texte a été modifié, l'ensemble des
modifications est visible et accessible.
#+END_COMMENT
** Avantages et inconvénients
:PROPERTIES:
:CUSTOM_ID: avantages-et-inconvénients-1
:END:
- Solution sophistiquée (donc un peu plus difficile à maîtriser que les
précédentes)
- Solution qui a fait ses preuves, en particulier dans un cadre
collaboratif sur de grands projets (noyau Linux)
- Permet d'enregistrer des modifications sur plusieurs fichiers à la
fois
- Une sauvegarde centralisée dont tous les membres du projet ont une
copie intégrale
#+BEGIN_COMMENT
Dans la partie approfondissements, nous rentrerons un peu plus dans les
aspects concrets de l'utilisation de =git=.
=git= devient de fait le standard de la gestion de version bien au-delà
des projets purement logiciels, cela vaut donc la peine de faire un
petit effort pour en maîtriser les rudiments.
Quelque soit la stratégie de gestion de version employée, le retour en
arrière est possible, mais lors des premières tentatives il vous faudra
faire preuve de calme et de patience !
#+END_COMMENT
* M1-S5: Les étiquettes et les logiciels d'indexation pour s'y retrouver
:PROPERTIES:
:CUSTOM_ID: c028al-w1-s5
:END:
** 1. Cahier de notes / cahier de laboratoire
:PROPERTIES:
:CUSTOM_ID: cahier-de-notes-cahier-de-laboratoire-4
:END:
1. Nous utilisons tous des cahiers de notes
2. Un aperçu historique de la prise de notes
3. Du fichier texte au langage de balisage léger
- Démonstration : markdown
4. Pérennité et évolutivité des notes avec la gestion de version
- Démonstration : gitlab
5. *Les étiquettes et les logiciels d'indexation pour s'y retrouver*
- Démonstration : DocFetcher
#+BEGIN_COMMENT
Nous revenons ici sur le problème de l'indexation, pas tant sur
l'indexation d'un document unique que sur l'indexation de documents
multiples dans des formats divers.
- comme nous l'avons déjà affirmé, prendre des notes abondantes et
détaillées n'est utile que si nous pouvons retrouver les informations
qu'elles contiennent quand nous en avons besoin
- pour des notes contenues dans un seul fichier texte, la fonction de
recherche de notre éditeur favori nous permet généralement d'aller
assez loin
- pour des notes manuscrites contenues dans un cahier, la méthode de
Locke --- que nous avons exposée dans notre deuxième séquence --- et
qui repose sur des mots clé ou étiquettes, donne de bons résultats
- les notes manuscrites sur fiches sont généralement stockées dans un
meuble dont la structure matérialise un index --- comme l'armoire de
Placcius et Leibniz ---
#+END_COMMENT
** Ainsi parlait Leibniz
:PROPERTIES:
:CUSTOM_ID: ainsi-parlait-leibniz
:END:
« Il me semble que l'apparat savant contemporain est comparable à un
grand magasin qui contient une grande quantité de produits, stockés de
façon totalement désordonnée, mélangée ; où les nombres ou lettres
d'indexation manquent ; où les inventaires et livres de comptes pouvant
aider à ordonner le contenu ont disparu.
Plus grande est la quantité d'objets amassés, plus petite est leur
utilité. Ainsi, ne devrions nous pas seulement essayer de rassembler de
nouveaux objets de toutes provenances, mais nous devrions aussi essayer
d'ordonner ceux que nous avons déjà. »
#+BEGIN_COMMENT
J'emploie ici le terme
d'« [[https://fr.wikipedia.org/wiki/Apparat_savant][apparat savant]] »
qui est un terme technique de l'édition désignant : citations,
références et sources, notes en bas de pages, introduction, texte en
langue originale (en parallèle avec la traduction), commentaire
historique ou philologique, index fontium (les sources), index locorum
(références avec renvoi à la page où le passage est cité ou mentionné,
par ex. : Évangile selon Marc 1, 1 : p. 100), index nominum (les noms
propres), index rerum (les thèmes), etc.
#+BEGIN_EXAMPLE
"It seems to me that the apparatus of contemporary scholarship is comparable to a very large store which, though it keeps a great variety of goods, yet is totally confused and in disorder, because all items are mixed up, because no numbers or letters of an index are displayed, and because inventories or account ledgers which could throw some light on the matter are missing.
"The larger the mass of collected things, the less will be their usefulness. Therefore, one should not only strive to assemble new goods from everywhere, but one must endeavor to put in the right order those that one already possesses."
#+END_EXAMPLE
http://www.backwordsindexing.com/index.html
#+END_COMMENT
** S'y retrouver dans un fichier texte
:PROPERTIES:
:CUSTOM_ID: sy-retrouver-dans-un-fichier-texte
:END:
[[file:img/recherche-avec-editeur.png]]
** S'y retrouver dans un cahier
:PROPERTIES:
:CUSTOM_ID: sy-retrouver-dans-un-cahier
:END:
[[file:img/IndexCahierLocke.jpg]]
** S'y retrouver dans des « fiches »
:PROPERTIES:
:CUSTOM_ID: sy-retrouver-dans-des-fiches
:END:
[[file:img/Placcius_cabinet_TabIV.png]]
** Problèmes, limitations, solutions ?
:PROPERTIES:
:CUSTOM_ID: problèmes-limitations-solutions
:END:
- Un seul document
- Indexation de fichiers numériques
- Étiquetage de fichiers numériques au sens large
- Moteur de recherche pour indexation et recherche globale
#+BEGIN_COMMENT
- les techniques que nous venons de voir ou revoir ne fonctionnent que
pour un seul « document » --- recherche avec l'éditeur de texte, index
d'un cahier --- et/ou pour un seul type de document
- les outils informatiques dont nous disposons nous permettent d'aller
plus loin dans l'indexation des fichiers numériques
- il est possible de rajouter des étiquettes ou mots-clés à des fichiers
textes comme à des fichiers images (=jpg=, =png=) ou des fichiers
« mixtes » (=pdf=) grâce aux métadonnées qu'ils contiennent
- les moteurs de recherche de bureau permettent d'indexer l'ensemble des
fichiers textes d'une arborescence donnée mais aussi les métadonnées
des autres fichiers
#+END_COMMENT
** Trouver un mot quelconque avec un moteur de recherche de bureau (=DocFetcher=)
:PROPERTIES:
:CUSTOM_ID: trouver-un-mot-quelconque-avec-un-moteur-de-recherche-de-bureau-docfetcher
:END:
[[file:img/Trouver_un_mot_avec_DocFetcher.png]]
** Le problème de l'« abondance »
:PROPERTIES:
:CUSTOM_ID: le-problème-de-labondance
:END:
[[file:img/Trouver_calcium_avec_DocFetcher.png]]
** Ajouter des étiquettes ou mots clés dans un fichier texte (=Markdown=)
:PROPERTIES:
:CUSTOM_ID: ajouter-des-étiquettes-ou-mots-clés-dans-un-fichier-texte-markdown
:END:
[[file:img/Ajout_etiquette_avec_Markdown.png]]
** Trouver une étiquette avec un moteur de recherche de bureau (=DocFetcher=)
:PROPERTIES:
:CUSTOM_ID: trouver-une-étiquette-avec-un-moteur-de-recherche-de-bureau-docfetcher
:END:
[[file:img/Trouver_etiquette_avec_DocFetcher.png]]
** Les fichiers images contiennent des métadonnées
:PROPERTIES:
:CUSTOM_ID: les-fichiers-images-contiennent-des-métadonnées
:END:
[[file:img/Metadonne_fichier_index.jpg]]
** Les métadonnées peuvent être modifiées
:PROPERTIES:
:CUSTOM_ID: les-métadonnées-peuvent-être-modifiées
:END:
[[file:img/Metadonne_fichier_index2.jpg]]
** Les moteurs de recherche de bureau peuvent lire les métadonnées
:PROPERTIES:
:CUSTOM_ID: les-moteurs-de-recherche-de-bureau-peuvent-lire-les-métadonnées
:END:
[[file:img/Trouver_etiquette_avec_DocFetcher2.jpg]]
** Conclusion
:PROPERTIES:
:CUSTOM_ID: conclusion
:END:
En combinant :
- des étiquettes insérées dans nos fichiers textes, images, =PDF=, etc
- avec un moteur de recherche de bureau
nous pouvons espérer éviter le « cauchemar de Leibniz »
# Comment rajouter des étiquettes dans un fichier Markdown ?
Pour rajouter une étiquette ou un mot clé visible par un `moteur de recherche de bureau`, nous pouvons les insérer dans des `commentaires`, c'est-à-dire des parties du fichier texte `source` qui ne seront pas montrées par le logiciel de rendu — comme le navigateur internet lors de la génération d'une sortie au format `HTML`.
Le [didacticiel Markdown](https://enacit1.epfl.ch/markdown-pandoc) de Jean-Daniel Bonjour nous explique clairement comment faire cela en section `3.2.7.4 Autres remarques sur les listes`. Pour rajouter en commentaire l'étiquette `:ceci-est-une-étiquette:`, il suffit de taper : `<!-- :ceci-est-une-étiquette: -->`. Nous pouvons ainsi étiqueter les différents éléments d'une liste :
* le premier élément ; <!-- :étiquette-1: -->
* le deuxième élément. <!-- :étiquette-2: -->
Et voilà !
\ No newline at end of file
#+OPTIONS: ':nil *:t -:t ::t <:t H:3 \n:nil ^:nil arch:headline
#+OPTIONS: author:t broken-links:nil c:nil creator:nil
#+OPTIONS: d:(not "LOGBOOK") date:t e:t email:nil f:t inline:t num:t
#+OPTIONS: p:nil pri:nil prop:nil stat:t tags:t tasks:t tex:t
#+OPTIONS: timestamp:t title:t toc:t todo:t |:t
#+TITLE: Notes sur le module 1 : cahier de notes / cahier de laboratoire
#+AUTHOR: Christophe Pouzat
#+EMAIL: christophe.pouzat@parisdescartes.fr
#+LANGUAGE: fr
#+SELECT_TAGS: export
#+EXCLUDE_TAGS: noexport
#+CREATOR: Emacs 25.3.1 (Org mode 9.0.9)
#+STARTUP: indent
* Introduction au module
La mise en œuvre de la « recherche reproductible ou réplicable » requiert en plus des codes et des données une description de la façon dont les premiers ont été appliqués aux secondes. Cette description devrait contenir une *discussion du choix* des paramètres / arguments des codes lorsque ceux-ci ne sont pas choisis de façon automatique / algorithmique. Des considérations du même ordre doivent d'ailleurs s'appliquer à la conception (choix des algorithmes) et à la réalisation (choix du langage, des librairies, etc.) des codes comme à la conception et à la réalisation de la collecte de données, c'est-à-dire des expériences, des enquêtes, etc.
Le praticien de la recherche reproductible se trouve ainsi confronté à un problème somme toute classique : garder une trace, documenter ce qui est fait. L'épitête « classique » se justifie dès lors que le lecteur réalise qu'il a lui aussi souvent été confronté à ce problème même si sous des formes légérement différentes. Ainsi, bon nombre d'entre nous doit effectuer un travail bibliographique plus ou moins fréquemment, ce qui génère des « notes » pouvant prendre diverse formes sur un ou plusieurs supports. Mais ce travail de prise de notes, ce « traçage », ne s'arrête, le plus souvent, pas là. Prenons le cas de l'algorithme à mettre en œuvre ; après une étude bibliographique en ayant identifié quelques-uns /a priori/ applicable à la situation rencontrée, il nous faudra soit les coder nous-mêmes, soit les trouver déjà codés sur un dépôt type [[https://github.com/][github]] ou [[https://about.gitlab.com/][gitlab]] ; quelque soit la solution adoptée, il nous faudra la documenter -- /en expliquer les raisons/, ce qui peut impliquer une courte étude comparative -- avec des références adéquates ce qui générera de nouvelles notes sur support papier ou numérique. En poursuivant cette logique, on voit vite que la quasi totalité de notre activité peut (ou devrait) s'accompagner d'une prise de notes. Voilà pourquoi notre premier module traitera d'une question qui ne se limite pas, loin s'en faut, à la recherche reproductible, celle du « cahier de notes ». Ce module commencera donc en vous disant quelque chose que vous savez déjà (!) : « nous devons tous prendre des notes. »
Si nous devons tous prendre des notes, nos prédécesseurs ont du le faire aussi. Cette constatation élémentaire faite, nous éviterons de croire que nous sommes les premiers à avoir à faire face un déluge d'informations. Nous en profiterons pour apprendre comment nos brillants ancêtres s'y sont pris. En nous inspirant de nos connaissances des « anciennes » techniques, nous verrons ensuite comment mettre à profit les outils fournis par l'informatique.
Les fichiers texte et les langages de balisage léger vont nous permettre de structurer nos notes et de les « recycler » facilement (dans des articles, des pages web, etc.). La gestion de version nous évitera de tout perdre tout en gardant trace de nos corrections et modifications successives. Enfin, reprendre une activité de zéro parce que retrouver la bonne information dans la jungle de nos notes prendrait plus de temps ne sera plus qu'un souvenir avec la construction d'index.
** Le « cahier de notes »
Le « cahier de notes » doit être considéré ici « au sens large » ; c'est-à-dire que, suivant le contexte, il sera plus proprement appelé « cahier de terrain », « cahier d'observations », « journal » ou « cahier de laboratoire ». Ce qui nous intéresse ici est la notion de supports (papiers ou numériques) dans lesquels des informations sont stockées au fil du temps -- contrairement au cas d'un mémoire ou d'un article où c'est la logique de l'argumentation qui structure le contenu -- ; ces informations sont de plus de nature souvent hétérogène et leurs supports, lorsqu'ils sont multiples, aussi (par exemple, un cahier de notes associé à des fichiers textes).
*** Exemples concrets de « cahier de notes »
- [[http://unesdoc.unesco.org/images/0007/000748/074877fo.pdf][Les cahiers de Léonard de Vinci]] et la page Wikipédia sur [[https://fr.wikipedia.org/wiki/Codex_Leicester][Le Codex Leicester]] ;
- [[https://en.wikipedia.org/wiki/Galileo_Galilei][la page wikipedia sur Galilée]] contient de nombreux liens, certains vers ses cahiers de notes ;
- [[http://gallica.bnf.fr/Search?ArianeWireIndex=index&p=1&lang=EN&f_typedoc=manuscrits&q=Louis+Pasteur+registres][Les « registres de laboratoire » de Pasteur]] sont disponibles sur Gallica ;
- [[http://gallica.bnf.fr/ark:/12148/btv1b90797770/f1.image.r=Emile%20Zola][Les dossiers préparatoires de Zola pour les Rougon-Macquart]] sont aussi disponibles sur Gallica ;
- [[https://ebooks.adelaide.edu.au/c/cook/james/c77j/index.html][Le journal de bord de James Cook]] lors de son premier voyage sont consultables -- [[http://southseas.nla.gov.au/journals/hv01/title.html][un autre exemple]] plus complet est aussi disponible --, la [[https://en.wikipedia.org/wiki/James_Cook][page Wikipedia]] contient un grand nombre de liens ;
- L'essentiel des [[http://darwin-online.org.uk/][cahiers de notes de Charles Darwin]] est consultable en ligne ;
- [[http://linnean-online.org/61332/#/0][Les fiches de Carl von Linnée]] sont consultables en ligne ;
- [[http://scarc.library.oregonstate.edu/coll/pauling/rnb/index.html][Les cahiers de laboratoire de Linus Pauling]] sont disponibles dans leur intégralité ;
- L'histoire de la [[https://fr.wikipedia.org/wiki/Figure_de_la_Terre_et_m%C3%A9ridienne_de_Delambre_et_M%C3%A9chain#M%C3%A9ridienne_de_Delambre_et_M%C3%A9chain_et_progr%C3%A8s_scientifiques_%C3%A0_la_m%C3%AAme_%C3%A9poque][mesure du méridien]] de Dunkerke à Barcelone par Delambre et Méchain est remarquablement contée dans le livre de Ken Alder, « Mesurer le monde - 1792-1799 : l'incroyable histoire de l'invention du mètre » (en poche chez Flammarion) ; les cahiers de notes y jouent un rôle tout à fait primordial.
* Notes et références sur la séquence 1 : « Nous utilisons tous des cahiers de notes »
** Manuscrits annotés
En guise d'entrée dans l'univers des manuscrits annotés, je fais suivre une petite sélection de passages du premier chapitre de « LA PAGE. DE L'ANTIQUITÉ À L'ÈRE DU NUMÉRIQUE » d'Anthony Grafton (Hazan, 2012) :
#+BEGIN_EXAMPLE
Par le mouvement même de sa plume sur la page, il est clair que
Casaubon maîtrise tout ce qu'il lit. Constamment, il souligne des
mots et des expressions, il note en marge des mots clés et des résumés
montrant qu'il a lu attentivement, même quand, précise-t-il dans son
journal intime, il étudie en une journée quarante à cinquante pages
in-folio de grec émaillées de nombreuses abréviations. Les passages
plus importants donnent lieu en marge à des commentaires plus
longs. Sur les pages de titre, Casaubon porte très souvent — un peu
comme Montaigne — un jugement global sur la valeur de l'ouvrage.
Par ailleurs, il note ses réflexions dans des carnets, ou prend
des notes sur des textes qu'il ne peut pas acheter. Tels qu'ils sont
réunis dans sa bibliothèque, ses livres représentent une vie entière de
lecture que l'on peut reconstituer au fil des pages.
#+END_EXAMPLE
Pages 32 et 33, à propos d'[[https://fr.wikipedia.org/wiki/Isaac_Casaubon][Isaac Casaubon]] (1559-1614).
#+BEGIN_EXAMPLE
Pourtant, Harvey a laissé beaucoup plus que cela, et notamment
des traces des ses lectures sous forme de plus d'une centaine de livres
couverts d'annotations magnifiquement écrites de sa belle écriture
italique — en plus des cahiers dans lesquels il notait des extraits.
Manifestement, Harvey considérait la lecture comme sa profession,
et il en a fait aussi un art. Décennie après décennie, il couche ses
pensées sur l'histoire dans une édition in-folio de 1555 de l'Histoire
romaine de Tite-Live. Ses notes, en latin pour la plupart, parcourent
les marges, se répandent entre les chapitres et remplissent
des feuilles volantes, prenant un aspect particulièrement érudit et
assez rébarbatif.
#+END_EXAMPLE
Pages 35 et 36, à propos de [[https://en.wikipedia.org/wiki/Gabriel_Harvey][Gabriel Harvey]] (1545-1630).
#+BEGIN_EXAMPLE
... Mais dans l'exemplaire de travail qui subsiste du
texte, l'édition de base de 1549, il [Casaubon] introduit tant d'annotations
précises que les catalogueurs de la Bibliothèque bodléienne, qui n'étaient
pas rompus à la rhétorique, ont classé ce livre imprimé parmi les manuscrits.
#+END_EXAMPLE
Page 40.
** Armoires à notes de Placcius et Leibniz
J'ai trouvé cet exemple dans les travaux d'[[https://projects.iq.harvard.edu/ablair][Ann Blair]] comme « [[https://dash.harvard.edu/handle/1/4774908][The Rise of Note-Taking in Early Modern Europe]] » et son livre « [[https://yalebooks.yale.edu/book/9780300165395/too-much-know][TOO MUCH TO KNOW. Managing Scholarly Information before the Modern Age]] », publié chez /Yale University Press/ en 2011.
** La préface de « L'île des pingouins » d'Anatole France
Étant très loin de connaître Anatole France sur le bout des doigts, j'ai trouvé la référence citée dans le remarquable article de Keith Thomas publié par la /London Review of Books/, [[https://www.lrb.co.uk/v32/n11/keith-thomas/diary][le 10 juin 2010]]. Cet article (en anglais) décrit et discute le travail concret de prise de notes par un historien, il est de plus très bien écrit et plein d'anecdotes.
** Les livres de bord
Je remercie Joël Caselli de m'avoir aidé à interpréter le contenu du livre de bord d'Éric Tabarly.
Le projet européen de reconstruction des climats des océans atlantique et indien (et non pacifique comme je le dis dans le cours !) : [[http://webs.ucm.es/info/cliwoc/][/Climatological Database for the World's Oceans 1750-1850/]] ; dispose d'un site internet très intéressant (mais en anglais).
On trouvera des citations abondantes (et effrayantes) de livres de bord de navires négriers dans le livre de Marcus Rediker « À bord du négrier : Une histoire atlantique de la traite » (disponible en édition de poche).
** Un absent : le cahier de laboratoire classique
Je traduis ici la section 6.2 /Notebooks and Records/ du remarquable livre de E. Bright Wilson /An Introduction to Scientific Research/ réimprimé par Dover.
Il est difficile de concevoir un cahier de laboratoire parfait et il est malheureusement rare d'en trouver un qui soit même à peu près satisfaisant ; la conservation d'une trace écrite du travail effectué est néanmoins une source majeure d'efficacité. Il y aura forcément des gens opposés à un ensemble de règles fixes, mais cela sera probablement plus rare pour le rituel de garder un cahier que sur d'autres sujets. Par conséquent, un ensemble de règles qui sont généralement considérées comme satisfaisantes, voire même essentielles, seront quelque peu dogmatiquement énoncées.
De grandes découvertes ont été retardées en raison d'une négligente tenue des traces écrites. L'astronome Le Monnier est ainsi supposé avoir observé la planète Uranus à plusieurs reprises -- avant que son identification comme planète ait été annoncée par Herschel --, mais a décidé qu'elle était une étoile fixe. Cela s'explique probablement en partie par le fait qu'il a écrit ses mesures sur des morceaux de papier, y compris un sac en papier contenant à l'origine de la poudre pour cheveux !
Les cahiers de laboratoire doivent être solidement reliés, d'une taille approximative de 20 x 25 cm, avec des pages numérotées. Les feuilles séparées sont trop facilement perdues pour être satisfaisantes, d'autant plus qu'un cahier de laboratoire subit souvent un traitement un peu rude avec peut-être des projections occasionnelles d'acide [c'est un physico-chimiste qui écrit]. Le cas de mesures répétées constitue une exception où une ébauche spéciale imprimée est souvent utile si un bon système est établi pour collecter et relier les feuilles séparées. Les pages avec des lignes sont généralement utilisées, mais il s'agit d'une question de goût personnel, et certaines préfèrent des pages blanches ou à carreaux. Un tampon en caoutchouc peut être utilisé pour fournir des en-têtes pour les entrées les plus communes.
Les données doivent être entrées directement dans le cahier au moment de l'observation. Il est intolérable d'utiliser sa mémoire ou des fragments de papier pour l'enregistrement primaire, du fait de l'inévitabilité des erreurs et des pertes. Il devrait donc y avoir une bonne place pour le cahier à coté du poste de travail, et l'expérimentateur ne devrait jamais être sans son cahier lorsqu'il est en action.
Les données doivent être enregistrées à l'encre, de préférence une encre permanente, un buvard peut être pratique. Sinon, la trace écrite est trop éphémère. Les cahiers sont soumis à une utilisation intensive et les écritures au crayons se détériorent trop rapidement. Lorsque le cahier peut être utilisé comme preuve pour un brevet, l'usage de l'encre s'impose.
Des graphiques approximatifs et qualitatifs peuvent être dessinés directement, mais les graphiques précis sont généralement préparés avec le papier graphique du type le plus approprié [pensez au papier millimétré]. Ils sont ensuite soigneusement collés dans le cahier, une page vierge étant découpée afin de compenser l'épaisseur ajoutée.
Les cahiers doivent porter le nom de l'utilisateur et les dates couvertes. [...]. Les huit ou dix premières pages devraient être réservées pour une table des matières. Il s'agit de lignes ajoutées chronologiquement pour chaque série d'expériences similaires, ainsi que la référence de la page. La table des matières est extrêmement utile pour trouver des éléments plus tard et est très simple à suivre. Un index au dos du cahier est avantageux mais pas indispensable.
Chaque élément devrait être datée et, si plusieurs personnes utilisent un cahier (généralement pas recommandé), paraphé. Le contenu ne devrait pas inscrit de façon trop dense sur les pages ; le papier est bon marché par rapport aux autres dépenses de recherche.
La principale difficulté est de décider ce qu'il faut écrire dans le cahier. Évidemment, on entre les résultats numériques et les valeurs des variables indépendantes telles que la température, la composition ou la pression qui sont directement pertinentes. Il est également nécessaire d'avoir un système d'entrées ou de références afin que, plus tard, il soit possible de dire quel appareil a été utilisé et dans quelles circonstances. Une description assez complète de l'appareil devrait être conservée. Ensuite, lorsque des modifications sont apportées à l'appareil, elles doivent être décrites immédiatement dans le cahier. Il devrait également être possible de retracer la source des courbes d'étalonnage, des corrections, etc., qui étaient appropriées aux données d'un jour donné. Il est utile que les exigences relatives à l'écriture d'un article, d'une thèse ou d'un livre soient gardées à l'esprit. Une telle tâche, une fois effectuée, entraîne généralement la résolution solennelle de garder un cahier plus détaillé dans le futur. Essayer de comprendre le cahier de notes de quelqu'un d'autre constitue aussi un exercice hautement salutaire. Toutes les références aux appareils, aux lieux, aux horaires, aux livres, aux articles, aux graphiques et aux personnes devraient être suffisamment explicites pour être compréhensibles des années plus tard. *Il devrait être possible de prendre chaque article scientifique et de montrer exactement où chaque figure, description ou déclaration est justifiée par des observations originales dans le cahier de laboratoire, et exactement pourquoi les nombres final et original diffèrent, si tel est le cas*.
Un énoncé du but de chaque expérience et un résumé des conclusions obtenues rendent le cahier beaucoup plus utile.
Les croquis, dessins et diagrammes sont essentiels. Comme tant d'observations sont visuelles, /il est important de noter ce qui est réellement vu, y compris des éléments qui ne sont pas entièrement compris lors de leur observation/.
Les expériences mauvaises ou non prometteuses, même celles considérées comme des échecs, devraient être entièrement enregistrées. Elles représentent un effort qui ne doit pas être gaspillé, car souvent quelque chose peut être récupéré, même si ce n'est qu'une connaissance de ce qu'il ne faut pas faire.
Les données doivent toujours être entrées dans leur forme la plus primaire, et non après un calcul ou une transformation. Si c'est le rapport de deux observations qui est intéressant, mais si les deux nombres sont effectivement observés, les deux nombres doivent être enregistrés. Si le poids précis d'un objet est important, les poids d'équilibrage individuels utilisés et leur identification devraient être inclus, c'est-à-dire le numéro de série de leur boîte. Dans le cas contraire, il devient impossible d'appliquer ultérieurement des corrections d'étalonnage ou de modifier les corrections si de nouvelles valeurs apparaissent. Naturellement, ce détail n'est pas nécessaire si seulement un poids approximatif est impliqué. La forme tabulaire est la meilleure pour les données numériques. Les unités doivent être notées.
Lorsque des brevets sont impliquées, il peut être souhaitable d'authentifier les pages des cahiers à intervalles réguliers. Le témoin devrait être quelqu'un qui comprend le contenu mais qui n'est pas impliqué dans la recherche. Un contenu ajouté ultérieurement à une page devrait l'être dans une encre de couleur différente, et toutes les modifications devraient être paraphées, authentifiées et datées si elles sont susceptibles d'être importantes. Les entreprises industrielles font ainsi généralement respecter leurs propres règles en matière de cahiers de laboratoire.
*Numéros d'identification*. Il est stupide de consacrer du temps et de l'argent à des enregistrements de différents types [...] si ceux-ci sont ensuite perdus ou mélangés. Tout enregistrements qui ne peut être inclut directement dans le cahier de notes devraient porter une identification complète indélébile. Un système simple qui a fait ses preuves consiste à écrire à l'encre sur chaque enregistrement un symbole identifiant le cahier, puis le numéro de page sur lequel les données auxiliaires sont enregistrées. Si plus d'un enregistrement sont mentionnés sur une page du cahier, des lettres ou des chiffres supplémentaires peuvent être ajoutés. Ainsi, EBW II 85c identifie le troisième enregistrement discuté à la page 85 du deuxième cahier EBW. C'est mieux qu'un numéro de série qui ne dit pas, sans clé supplémentaire, où chercher la description le concernant dans le cahier.
Un bon système de classement est indispensable pour tous les films, les photographies, les schémas, les graphiques, les diagrammes de circuit, les dessins, les plans, etc. Il est plus difficile de concevoir des méthodes de dépôt satisfaisantes pour des matériaux très petits ou très grands. Les premiers sont facilement perdus et les dernier très volumineux. [...]
Il est important d'archiver les dessins et les plans à partir desquels les appareils utilisés ont été construits, même si ces dessins sont grossiers. Ils doivent être datés, paraphés et étiquetés ; en fait, tout morceau de papier contenant une information utile devrait être marqué de la sorte. Lorsqu'un équipement électronique ou autre est fabriqué, son diagramme doit être soigneusement préparé et entièrement étiqueté avec toutes les constantes. L'appareil doit porter un numéro de série qui apparaît également sur ce diagramme. Lorsque des modifications sont apportées, celles-ci doivent être indiquées sur le schéma et datées ou un diagramme révisé et daté doit être préparé. L'ancien ne doit pas être obscurci ou jeté, car il peut être nécessaire pour expliquer des données antérieures, considérées ultérieurement comme étranges. [...]
Le but de toute cette pratique de prise de notes est de préserver la valeur [le temps et les moyens humains et matériels investis dans la recherche]. Elle devrait être soigneusement conçus pour s'adapter aux conditions de chaque laboratoire et devraient être adéquate mais pas trop élaborés. *Si l'on exige trop de la nature humaine, le système ne fonctionnera pas*.
* Notes et références sur la séquence 2 : « Un aperçu historique de la prise de notes »
** Références générales
En plus des deux livres déjà cités :
- « LA PAGE. DE L'ANTIQUITÉ À L'ÈRE DU NUMÉRIQUE » d'Anthony Grafton (Hazan, 2012) ;
- « [[https://yalebooks.yale.edu/book/9780300165395/too-much-know][TOO MUCH TO KNOW. Managing Scholarly Information before the Modern Age]] », d'Ann Blair publié chez /Yale University Press/ en 2011 ;
j'ai utilisé :
- « L'histoire du livre » de Frédéric Barbier ;
- le remarquable site de Jacques Poitou, [[http://j.poitou.free.fr/pro/index.html][langages écritures typographies]] ;
- le site [[http://classes.bnf.fr/ecritures/][l'aventure des écritures]] de la BNF ;
- le catalogue de l'exposition de la BNF « Tous les savoirs du monde : Encyclopédies et bibliothèques de Sumer au XXIème siècle » ;
- « [[http://litmedmod.ca/sites/default/files/pdf/vandendorpe-papyrusenligne_lr.pdf][Du papyrus à l'hypertexte]] » de Christian Vandendorpe (La Découverte, 1999).
** Sur les tablettes de cires
Voir le site de Jacques Poitou (d'où les illustrations sont empruntées) et le livre de Frédéric Barbier, « L'histoire du livre ».
** Sur le passage du rouleau (/volumen/) au codex
Voir le livre de Frédéric Barbier, celui d'Anthony Grafton.
Le /volumen/ est un livre à base de feuilles de papyrus collées les unes aux autres et qui s'enroule sur lui-même. Il a été créé en Égypte vers 3000 av. J.-C. Le texte est rédigé en colonnes parallèles assez étroites. C'est le support du texte par excellence durant les trente siècles précédant notre ère, d'abord en Égypte, puis dans tout le monde méditerranéen.
Comme l'explique Frédéric Barbier : « La forme du /volumen/ impose une pratique de lecture complexe : il faut dérouler (/explicare/) et enrouler en même temps, ce qui interdit par exemple, de travailler simultanément sur plusieurs rouleaux (un texte et son commentaire) ou de prendre des notes, impose une lecture suivie et empêche la simple consultation. »
Le /volumen/ n'est clairement pas adapté à une lecture « nomade » ; imagine-t-on Ulysse partant pour son Odyssée avec les 24 /volumen/ de l'Iliade ?
Le /volumen/ est à l'origine du terme « volume » dans un « livre en plusieurs volumes » comme dans la désignation du concept géométrique.
Le passage au codex repose sur deux innovations :
- la collection des tablettes de cires en « groupes reliés » ;
- la généralisation du parchemin (peau, généralement, de mouton spécialement préparée) au détriment du papyrus. Cette généralisation résulte une lutte pour l'hégémonie culturelle entre deux descendants de généraux d'Alexandre le Grand, en effet d'après Pline l'ancien : [[https://fr.wikipedia.org/wiki/Ptol%C3%A9m%C3%A9e_V][Ptolémé Épiphane]] d'Alexandrie cherchait à empêcher [[https://fr.wikipedia.org/wiki/Eum%C3%A8ne_II][Eumène II]] d'établir une bibliothèque à Pergame (au 2e siècle avant J.-C.) et avait interdit l'exportation du papyrus (produit exclusivement en Égypte), ce qui incita Eumène à chercher un substitut qui devint le parchemin.
Le remplacement du rouleau par le codex aura des conséquences majeures sur l'organisation du livre ainsi que sur la façon de lire et il permettra le développement ultérieur de l'imprimerie.
La principale révolution introduite par le codex est la notion de page. Grâce à elle, le lecteur peut accéder de manière directe à un chapitre ou à un passage du texte, alors que le rouleau impose une lecture continue. *Les mots ne sont de plus pas séparés par des espaces*. Comme l'écrit Collette Sirat : « Il faudra vingt siècles pour qu’on se rende compte que l’importance primordiale du codex pour notre civilisation a été de permettre la lecture sélective et non pas continue, contribuant ainsi à l’élaboration de structures mentales où le texte est dissocié de la parole et de son rythme. »
Au fil des siècles, le codex — qu'on désigne le plus souvent comme un manuscrit — va évoluer et se donner peu à peu les attributs du livre moderne : séparation entre les mots (VIIe siècle), début de ponctuation (VIIIe siècle), table des matières, titre courant, marque de paragraphe (XIe siècle), pagination, index (XIIIe siècle), etc.
Un point intéressant : le contenu de la Thora est « fixé » avant l'apparition du codex et, aujourd'hui encore, la Thora est écrite sur des /volumen/ (dans les synagogues au moins). La religion chrétienne se développe en même temps que le codex, adopte ce support et le répand ; elle ne donnera jamais au /volumen/ un statut « supérieur », pas plus que ne le fera la religion musulmane.
** Sur Eusèbe de Césarée
Pour en savoir plus sur [[https://fr.wikipedia.org/wiki/Eus%C3%A8be_de_C%C3%A9sar%C3%A9e][Eusèbe de Césarée]], consultez le passionnant deuxième chapitre du livre d'Anthony Grafton.
** Parallèle chinois
Comme je le dis, mon inculture fait que je ne rends pas justice aux contributions chinoises, musulmanes, précolombienne, etc. J'essaierai de combler cette énorme lacune pour les seconde version du CLOM...
Ce que je dis sur le passage du volumen au codex accompagné d'un développement des « outils de navigation » (index, table des matières, etc) en Chine lors du développement de leishus vient du bouquin d'Ann Blair (p. 31) qui cite un article de Susan Cherniack, « Book Culture and Textual Transmission in Sung China », /Harvard Journal of Asiatic Studies/ Vol. 54, No. 1 (Jun., 1994), pp. 5-125.
** Retour sur l'armoire à notes
Nous revenons sur le « bout de papier » ou la fiche comme support de note. L'inconvénient est que le bout de papier ou la fiche se perdent facilement et ne servent à rien s'ils ne sont pas *classés* en plus d'être rangés. Problème résolu par l'armoire de Placcius. D'une certaine façon, sa conception fait qu'on accède à son contenu par l'index.
L'avantage est que les notes peuvent être réorganisées si elles contiennent des information sur plusieurs sujets. Elle peuvent aussi être directement collées dans un livre lors de la composition d'un florilège ou d'un ouvrage de synthèse.
Ce dernier procédé était très couramment employé par les humanistes et les érudit de la renaissance et du début de la période moderne. [[https://fr.wikipedia.org/wiki/Conrad_Gessner][Conrad Gessner]] (1516-1565) était un champion de cette technique ; il obtenait même parfois ses fiches en découpant les pages des livres. Encore une fois, ne faites pas cela avec les livres de bibliothèques !
** L'index et John Locke
Sur l'origine de l'index, on pourra lire l'article de Jean Berger : [[https://www.theindexer.org/files/25-2-berger.pdf][Indexation, Memoire, pouvoir et representations au seuil du XIIe siecle : La redecouverte des feuillets de tables du Liber De Honoribus, premier cartulaire de la collegiale Saint-Julien de Brioude]], /The Indexer/.
La méthode de John Lock est expliquée dans l'article /Indexing commonplace books: John Locke’s method/ d'Alan Walker, [[https://www.theindexer.org/issues/query.php?vol=22&iss=3][The Indexer]], vol. 22, p. 114-118, 2001.
Sur [[https://fr.wikipedia.org/wiki/John_Locke][John Locke]] (1632-1704) « papa du libéralisme » et actionnaire de la /Royal African Company/ principale compagnie négrière britannique, voir l'article [[https://en.wikipedia.org/wiki/John_Locke#Constitution_of_Carolina][Wikipedia]] (en anglais) et le livre « Contre-histoire du libéralisme » de Domenico Losurdo (La Découverte / Poche, 2014, p. 34-36).
* Notes et références sur la séquence 3 : « Du fichier texte au langage de balisage léger »
** Fichier texte et éditeur de texte
Une définition plus technique (et moins circulaire !) du fichier texte se trouve sur [[https://fr.wikipedia.org/wiki/Fichier_texte][la page wikipédia]] consacrée au sujet. Pour plus de détails sur les éditeurs de texte, voir aussi la [[https://fr.wikipedia.org/wiki/%C3%89diteur_de_texte][page wikipédia correspondante]].
Un logiciel de « [[https://fr.wikipedia.org/wiki/Traitement_de_texte][traitement de texte]] » est plus sophistiqué qu'un simple éditeur de texte ; il permet de faire plus, ce qui sous entend qu'il peut aussi ouvrir et manipuler des fichiers textes.
*Attention* : le format « natif » des traitements de texte est rarement un format texte. Les fichiers =doc= et =docx= de =Word= et =odt= de =LibreOffice= /ne sont pas des fichiers textes/.
** Le cas du fichier =PDF= ouvert avec un éditeur de texte
Dans le cours filmé, j'utilise l'exemple du [[https://en.wikipedia.org/wiki/Portable_Document_Format][PDF]] — je donne l'adresse de la page wikipedia en anglais, bien plus complète que celle en français — ouvert avec un éditeur de texte pour montrer que le fichier ne peut pas être visualisé avec un tel logiciel, il faut un logiciel de rendu dédié comme =Adobe Reader=, =Evince=, =MuPDF=, =Aperçu=,... Vous remarquez néanmoins que le début du fichier contient du texte (la première ligne nous apprend que le fichier utilise la version 1.3 du format =PDF=). Cette partie au format texte du fichier contient les méta-données — qui ne sont pas montrées, en tout cas pas directement, par les logiciels de rendu. Ces méta-données sont (en partie) au format [[https://en.wikipedia.org/wiki/Extensible_Metadata_Platform][XMP]] (/Extensible Metadata Platform/), nous y reviendrons dans la cinquème séquence.
** Sur l'UTF-8
Une table des symboles UTF-8, avec leur code se trouve à l'adresse : [[http://www.utf8-chartable.de/]]. C'est pratique pour insérer un symbole pas très courant comme la lettre « TLO » : Ꮰ de la langue cherokee, ou le symbole mathématique ∀, « pour tout ».
Pour ceux qui doivent souvent utiliser des lettres grecs (par exemple pour écrire des équations), il est possible sous Linux de (re)définir des combinaisons de touches pour générer directement les dites lettres. Ces combinaisons sont définies dans le fichier =.XCompose=, le début de mon fichier contient :
#+BEGIN_EXAMPLE
# On charge la base de donnée de Compose la plus complète en UTF-8
include "/usr/share/X11/locale/en_US.UTF-8/Compose"
# espace insécable fine
<Multi_key> <Multi_key> <Space> : " " U202F
# Lettres greques
<Multi_key> <space> <a> : "α" Greek_alpha
<Multi_key> <space> <A> : "Α" Greek_ALPHA
<Multi_key> <space> <b> : "β" Greek_beta
<Multi_key> <space> <B> : "Β" Greek_BETA
<Multi_key> <space> <g> : "γ" Greek_gamma
<Multi_key> <space> <G> : "Γ" Greek_GAMMA
<Multi_key> <space> <d> : "δ" Greek_delta
<Multi_key> <space> <D> : "Δ" Greek_DELTA
<Multi_key> <space> <e> : "ε" Greek_epsilon
<Multi_key> <space> <E> : "Ε" Greek_EPSILON
<Multi_key> <space> <z> : "ζ" Greek_zeta
<Multi_key> <space> <Z> : "Ζ" Greek_ZETA
<Multi_key> <space> <h> : "η" Greek_eta
#+END_EXAMPLE
J'ai en plus redéfini la « <Multi_key> » pour qu'elle corresponde à la touche « impression d'écran » de mon clavier. Pour apprendre à redéfinir des touches, consultez : [[https://wiki.archlinux.org/index.php/Keyboard_configuration_in_Xorg#Configuring_compose_key]].
* Notes et références sur la séquence 5 : « Les étiquettes et les logiciels d'indexation pour s'y retrouver »
** La structure de la séquence
Nous revenons ici sur le problème de l'indexation, pas tant sur l'indexation d'un document unique que sur l'indexation de documents multiples dans des formats divers :
- comme nous l'avons déjà affirmé, prendre des notes abondantes et détaillées n'est utile que si nous pouvons retrouver les informations qu'elles contiennent quand nous en avons besoin ;
- pour des notes contenues dans un seul fichier texte, la fonction de recherche de notre éditeur favori nous permet généralement d'aller assez loin ;
- pour des notes manuscrites contenues dans un cahier, la méthode de Locke — que nous avons exposée dans notre deuxième séquence — et qui repose sur des mots clé ou étiquettes, donne de bons résultats ;
- les notes manuscrites sur fiches sont généralement stockées dans un meuble dont la structure matérialise un index — comme l'armoire de Placcius et Leibniz — ;
- mais nous voulons ici aller plus loin, dans le cadre restreint des « notes » numérisées, en discutant de l'indexation de fichiers multiples qu'ils soient au format « texte » où dans d'autres format comme les images =jpg= où les fichier =pdf= ;
- cela nous amménera à introduire les « moteurs de recherche de bureau » et à expliquer comment des =étiquettes= ou =mots-clés= peuvent être ajoutés à nos fichiers.
** La citation de Leibniz
J'ai trouvé la citation introductive :
« Il me semble que l'apparat savant contemporain est comparable à un grand magasin qui contient une grande quantité de produits, stockés de façon totalement désordonnée, mélangée ; où les nombres ou lettres d'indexation manquent ; où les inventaires et livres de comptes pouvant aider à ordonner le contenu ont disparus.
Plus grande est la quantité d'objets amassés, plus petite est leur utilité. Ainsi, ne devrions nous pas seulement essayer de rassembler de nouveaux objets de toutes provenances, mais nous devrions aussi essayer d'ordonner ceux que nous avons déjà. »
sur le site [[http://www.backwordsindexing.com/index.html]], c'est donc une traduction de traduction. J'emploie ici le terme volontairement anachronique d'« [apparat savant](https://fr.wikipedia.org/wiki/Apparat_savant) » qui est un terme technique de l'édition désignant : citations, références et sources, notes en bas de pages, introduction, texte en langue originale (en parallèle avec la traduction), commentaire historique ou philologique, index fontium (les sources), index locorum (références avec renvoi à la page où le passage est cité ou mentionné, par ex. : Évangile selon Marc 1, 1 : p. 100), index nominum (les noms propres), index rerum (les thèmes), etc. La référence au « grand magasin » est, elle aussi anachronique !
Leibniz a, pendant une bonne partie de sa vie, « gagné celle-ci » comme [[https://www.reseau-canope.fr/savoirscdi/societe-de-linformation/le-monde-du-livre-et-des-medias/histoire-du-livre-et-de-la-documentation/biographies/leibniz-le-bibliothecaire.html][bibliothécaire]], ce qui explique en partie sont intérêt très poussé pour les questions de classifications, d'indexations, etc.
** Rechercher avec un éditeur de texte
La diapo correspondante rappelle juste au lecteur quelque chose qu'il sait déjà et qui est vue, par les gens qui passent des notes « papier » aux notes « numériques », comme le gros attrait du numérique.
Les gens de monde Unix/Linux connaissent aussi généralement le programme [[https://fr.wikipedia.org/wiki/Grep][grep]] qui permet de faire des recherches de mots et, plus généralement d'[[https://fr.wikipedia.org/wiki/Expression_r%C3%A9guli%C3%A8re][expressions régulières]], sur un ou /plusieurs/ fichiers ; nous y reviendrons.
** Recherche avec index construit « à la main » sur des cahiers de notes
Là encore, il s'agit juste d'un rappel pour les lecteurs assidus de ce cours ; à ce stade se sont des experts dans la méthode d'indexation de Locke.
** Recherche avec index « matérialisés »
Encore un rappel pour les lecteurs.
** Vers les outils « sophistiqués » de l'informatique
- les techniques que nous venons de voir ou revoir ne fonctionnent que pour un seul « document » — recherche avec l'éditeur de texte, index d'un cahier — et/ou pour un seul type de document ;
- les outils informatiques dont nous disposons nous permettent d'aller plus loin dans l'indexation des fichiers numériques ;
- il est possible de rajouter des étiquettes ou mots-clés à des fichiers textes comme à des fichiers images (`jpg`, `png`) ou des fichiers « mixtes » (`pdf`) grâce aux métadonnées qu'ils contiennent ;
- les moteurs de recherche de bureau permettent d'indexer l'ensemble des fichiers textes d'une arborescence donnée mais aussi les métadonnées des autres fichiers.
** Les moteurs de recherche de bureau
Les moteurs de recherche de bureau comme :
- [[http://docfetcher.sourceforge.net/fr/index.html][DocFetcher]] (Linux, MacOS, Windows) ;
- [[https://wiki.gnome.org/Projects/Tracker][Tracker]] (Linux) ;
- [[https://www.lesbonscomptes.com/recoll/index.html.fr][Recoll]] (Linux, MacOS, Windows) ;
- [[https://fr.wikipedia.org/wiki/Spotlight_(moteur_de_recherche)][Spotlight]] (MacOS) ;
permettent de rechercher le /contenu/ des fichiers textes, des courriels, des fichiers générés par les =traitements de texte= — c'est-à-dire des fichiers qui contiennent essentiellement du texte, mais qui sont stockés dans un format type =doc=, =docx=, =odt=, etc qui ne sont pas des formats texte —, des fichiers =pdf= — quand ceux-ci ne sont pas des /images/ de textes —, mais aussi des [[https://en.wikipedia.org/wiki/Portable_Document_Format#Metadata][métadonnées]] des fichiers =pdf=, etc.
Les moteurs de recherche de bureau « utilisent des techniques d'[[https://fr.wikipedia.org/wiki/Indexation_automatique_de_documents][indexation]] qui permettent de réduire considérablement les temps de recherche, par rapport aux fonctions de recherche intégrées par défaut aux systèmes d'exploitation. Au contraire de ces derniers, ils prennent aussi souvent en charge les [[https://fr.wikipedia.org/wiki/M%C3%A9tadonn%C3%A9e][métadonnées]], et sont capables de faire une [[https://fr.wikipedia.org/wiki/Analyse_syntaxique][analyse syntaxique]] des fichiers. » (Source : [[https://fr.wikipedia.org/wiki/Moteur_de_recherche_de_bureau][Moteur de recherche de bureau]] sur Wikipédia)
Comme exemple de « fonctions de recherche intégrées par défaut », on trouvera sur les systèmes Unix/Linux le programme [[https://fr.wikipedia.org/wiki/Grep][grep ]]avec lequel nous pouvons chercher les occurrences du mot « Galilée » dans le répertoire « RR_MOOC » de notre cours sur GitHub (après l'avoir cloné) :
#+NAME: grep-Leibniz-RR_MOOC
#+BEGIN_SRC sh :results output :exports both
grep -r Galilée
#+END_SRC
#+RESULTS: grep-Leibniz-RR_MOOC
: PITCHME.md:## Galilée qui observe les lunes de Jupiter
: PITCHME.md:Le 7 janvier 1610, Galilée fait une découverte capitale : il remarque trois « petites étoiles » à côté de Jupiter. Après quelques nuits d'observation, il découvre qu'il y en a une quatrième et qu'**elles accompagnent la planète**, c'est ce qu'il note sur son cahier d'observations. Ce sont les satellites visibles de Jupiter, qu'il nommera plus tard les étoiles Médicées ou astres médicéens – en l'honneur de ses protecteurs, la Famille des Médicis – et qui sont aujourd'hui appelés lunes galiléennes.
: PITCHME.md:Ces observations amèneront Galilée à rejeter l'hypothèse géocentrique (la terre est le centre de l'Univers et tout tourne autour d'elle) en faveur du système copernicien héliocentrique. Cela l'amènera indirectement (je « fais court ») et bien plus tard, le 22 juin 1633, a être condamné par l'inquisition, ce qui lui vaudra de finir ses jours en résidence surveillée.
: PITCHME.md:Remarquez l'avantage des « bouts de papiers classés » de Placcius et Leibniz sur le _codex_ de Galilée : les premiers peuvent être facilement réordonnées.
: Notes_module1.org:- [[https://en.wikipedia.org/wiki/Galileo_Galilei][la page wikipedia sur Galilée]] contient de nombreux liens, certains vers ses cahiers de notes ;
: Notes_module1.org:Comme exemple de « fonctions de recherche intégrées par défaut » on trouvera sur les systèmes Unix/Linux le programme [[https://fr.wikipedia.org/wiki/Grep][grep ]]avec lequel nous pouvons chercher les occurrences du mot « Galilée » dans le répertoire « RR_MOOC » de notre cours sur GitHub (après l'avoir cloné) :
: Notes_module1.org:grep -r Galilée
Une version plus sophistiquée de =grep= est fournie par le programme [[http://uzix.org/cgvg.html][cgvg]].
** Pourquoi des étiquettes
Une requête basée sur un simple mot renvoie souvent un très grand nombre de propositions, même si la plupart des moteurs de recherche de bureau permettent de filtrer ces dernières. Une façon efficace de limiter leur nombre est d'inclure dans nos documents des étiquettes, c'est-à-dire des points d'ancrage labelisés, qui seront aisément indexés par le moteur de recherche de bureau et dont le label ne correspond à aucun mot ou locution du dictionnaire — nous effectuons ainsi une version simplifiée du travail de l'/indexeur/, la personne chargée de construire l'index d'un livre. Pour que l'étiquette garde un sens, il suffit d'encadrer un mot par une paire de signes de ponctuation comme « : », « ; » ou « ? ». Un label comme « :code: » sera facilement mémorisé et fera un parfait équivalent du mot-clé « code » utilisé dans l'exemple du cahier de note de la deuxième séquence de ce module — pour illustrer la méthode de Locke.
Il nous reste encore nous reste encore un détail technique à régler dans le cas de nos notes prises en format texte comme =Markdown=. En effet, nous ne souhaitons pas que nos étiquettes apparaissent dans les sorties =html=, =pdf= ou =docx= de nos notes. Un façon de procéder, pour les langages de balisage légers qui ne disposent pas d'étiquettes — par exemple, =Markdown= n'en dispose pas, alors que =org= en a — et de les inclure dans des commentaires. En =Markdown=, tout ce qui est encadré par =<!--= et =-->= est considéré comme un commentaire et ne figure pas dans les sorties =html= ou =pdf= des notes. Nous pouvons ainsi utiliser :
#+BEGIN_EXAMPLE
<!-- :code: -->
#+END_EXAMPLE
à l'endroit de nos notes où nous souhaitons aller rapidement lorsque que nous cherchons une information relative à de la programmation (production de codes).
** Les métadonnées
*** Fichiers images
Nous savons à présent comment rajouter des étiquettes à un fichier au format texte, mais nous devons souvent aussi travailler avec des fichiers contenant des images ou des photos, comme les fichiers [[https://fr.wikipedia.org/wiki/JPEG][JPEG]] — les appareils photos numériques utilisent tous ce format —, [[https://fr.wikipedia.org/wiki/Graphics_Interchange_Format][GIF]] ou [[https://fr.wikipedia.org/wiki/Portable_Network_Graphics][PNG]]. La question se pose alors, peut-on ajouter des étiquettes à nos fichiers images de sorte que nos moteurs de recherche de bureau les indexent ? La réponse et oui, grâce aux [[https://fr.wikipedia.org/wiki/M%C3%A9tadonn%C3%A9e][métadonnées]] que contiennent ces fichiers. Les métadonnées, dans ce cas, sont des données stockées dans le fichier mais qui ne sont pas montrées par le logiciel de rendu (en tout cas, pas montrées par défaut). Nous savons tous que ces métadonnées « existent » ; ce sont elles qui contiennent la date, la localisation GPS, le temps d'exposition, etc. de nos photos numériques. Dans les fichiers =JPEG=, elles sont stockées suivant l'[[https://fr.wikipedia.org/wiki/Exchangeable_image_file_format][exchangeable image file format]] (=EXIF=). La plupart des logiciels de manipulations d'images et de photos permettent d'accéder au contenu des métadonnées et de les modifier. L'exemple illustré dans le cours utilise une solution très simple en « ligne de commande », [[http://owl.phy.queensu.ca/~phil/exiftool/][ExifTool]] qui permet de visualiser et de modifier les métadonnées. D'autres logiciels comme [[http://www.exiv2.org/index.html][exiv2]] ou [[https://imagemagick.org/script/index.php][ImageMagick]] permettent de le faire (pour ne citer que des logiciels libres disponibles sur Linux, Windows et MacOS). Certains des éléments du format =EXIF= sont des chaînes de caractères, c'est-à-dire du texte, que nous somme libres d'utiliser comme nous le souhaitons ; nous pouvons dès lors les utiliser pour rajouter nos étiquettes. Nous illustrons dans le cours comment le faire avec =ExifTool=, mais nous aurions aussi pu le faire avec le programme [[https://www.imagemagick.org/script/command-line-options.php#comment][mogrify]] d'ImageMagick. Tous les moteurs de recherche de bureau que nous avons mentionné vont « aller regarder » les métadonnées des fichier =JPEG= lors de la phase d'indexation et nous permettront ainsi d'exploiter les étiquettes que nous y aurons insérées.
=EXIF= n'est pas le seul format de métadonnées existant ; un format plus récent est l'[[https://fr.wikipedia.org/wiki/Extensible_Metadata_Platform][Extensible Metadata Platform ]](=XMP=), disponible pour un plus grand nombre de formats de fichiers — il n'est pour l'instant pas lu sur les fichiers =JPEG= par =DocFetcher=, c'est pourquoi nous avons mis en avant le format =EXIF=, mais cela devrait évoluer assez vite ; les autres moteurs comme =Tracker= et =Recoll= le lisent.
*** Fichiers =PDF=
En plus des fichiers images, nous sommes tous très fréquemment amenés à travailler avec les fichiers « composites » — contenant textes, images, et plus — que sont les fichiers [[https://fr.wikipedia.org/wiki/Portable_Document_Format][PDF]]. Ces fichiers contiennent eux aussi des métadonnées ; c'est d'ailleurs pour eux qu'Adobe a initialement introduit le format =XMP= que nous venons de discuter. Ces métadonnées peuvent être lues et modifiées, en particulier l'élément =Keywords= (mot-clé) qui peut contenir des chaînes de caractères de longueur arbitraires et qui est parfait pour accueillir nos étiquettes. Le programme =ExifTool=, permet de modifier les métadonnées des fichiers =PDF=. Les moteurs de recherche de bureau que nous avons mentionnés, vont tous aller lire les métadonnées des fichiers =PDF= lors de la phase d'indexation.
*** Fichiers audios
Les formats audio comme le [[https://fr.wikipedia.org/wiki/MPEG-1/2_Audio_Layer_III][mp3]] ou le [[https://fr.wikipedia.org/wiki/Ogg][ogg]] contiennent eux aussi des métadonnées, où sont stockés les titres, noms des interprètes, etc ; ces métadonnées peuvent être modifiées et sont lues par les moteurs de recherche de bureau lors de la phase d'indexation.
---
# C028AL-W1-S0
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/clap.png" style="width:50%; margin-top: none; border: none; background: none; box-shadow: none;" />
+++
## Les grandes lignes du module : cahier de notes / cahier de laboratoire
1. Nous utilisons tous des cahiers de notes
2. <!-- .element class="fragment" --> Un aperçu historique de la prise de notes
3. <!-- .element class="fragment" --> Du fichier texte au langage de balisage léger
- Démonstration : markdown
4. <!-- .element class="fragment" --> Pérennité et évolutivité des notes avec la gestion de version
- Démonstration : gitlab
5. <!-- .element class="fragment" --> Les étiquettes et les logiciels d'indexation pour s'y retrouver
- Démonstration : DocFetcher
Note:
__Première ligne__
Nous allons discuter ici d'une question qui dépasse la problématique de la recherche reproductible.
En effet, la mise en œuvre concrète de la recherche reproductible nécessite la tenue d'un cahier de notes et la prise de notes concerne tout le monde. Je commencerai donc ce module en vous disant quelque chose que vous savez déjà (!) : nous devons tous prendre des notes.
__Deuxième ligne__
Si nous devons tous prendre des notes, nos prédécesseurs ont du le faire aussi. Cette constatation élémentaire faite, nous éviterons de croire que nous sommes les premiers à avoir à faire face un déluge d'informations. Nous en profiterons pour apprendre comment nos brillants ancêtres s'y sont pris.
En nous inspirant de nos connaissances des « anciennes » techniques, nous verrons ensuite comment mettre à profit les outils fournis par l'informatique.
__Troisième ligne__
Les fichiers texte et les langages de balisage léger font nous permettre de structurer nos notes et de les « recycler » facilement (dans des articles, des pages web, etc.).
__Quatrième ligne__
La gestion de version nous évitera de tout perdre tout en gardant traces de nos corrections et modifications successives.
__Cinquième ligne__
Enfin, reprendre une activité de zéro parce que retrouver la bonne information dans la jungle de nos notes prendrait plus de temps ne sera plus qu'un souvenir avec la construction d'index.
---
# C028AL-W1-S1
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/clap.png" style="width:50%; margin-top: none; border: none; background: none; box-shadow: none;" />
+++
## 1. Cahier de notes / cahier de laboratoire
1. **Nous utilisons tous des cahiers de notes**
2. Un aperçu historique de la prise de notes
3. Du fichier texte au langage de balisage léger
- Démonstration : markdown
4. Pérennité et évolutivité des notes avec la gestion de version
- Démonstration : gitlab
5. Les étiquettes et les logiciels d'indexation pour s'y retrouver
- Démonstration : DocFetcher
Note:
La recherche reproductible est encore – mais pour peu de temps seulement ! –, une activité dont le nombre d'adeptes est restreint. Elle suppose par contre une prise de notes « rigoureuse » et là, notre propos commence à s'adresser à un groupe beaucoup plus large. C'est ce que nous allons illustrer ici par quelques exemples.
+++
## L'érudit qui annote son livre / manuscrit
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/ManuscritAnnoteEtCoupe.png" style="width:100%; margin-top: none; border: none; background: none; box-shadow: none;" />
Manuscrit d'œuvres d'Aristoteles (XIVe siècle).
Note:
Nous voyons ici un manuscrit du XIVe abondamment annoté par son propriétaire Nicasius de Planca. Cette forme de prise de note est extrêmement fréquente aussi bien à l'époque des manuscrits qu'aujourd'hui. Vous devriez néanmoins éviter de l'employer sur des livres empruntés dans une bibliothèque ou à des amis !
Les deux pages suivantes présentent un exemple d'une importance considérable pour l'histoire des sciences.
+++
## Galilée qui observe les lunes de Jupiter
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/GalileoManuscriptCoupe.png" style="width:90%; margin-top: none; border: none; background: none; box-shadow: none;" />
Note:
Le 7 janvier 1610, Galilée fait une découverte capitale : il remarque trois « petites étoiles » à côté de Jupiter. Après quelques nuits d'observation, il découvre qu'il y en a une quatrième et qu'**elles accompagnent la planète**, c'est ce qu'il note sur son cahier d'observations. Ce sont les satellites visibles de Jupiter, qu'il nommera plus tard les étoiles Médicées ou astres médicéens – en l'honneur de ses protecteurs, la Famille des Médicis – et qui sont aujourd'hui appelés lunes galiléennes.
+++
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/GalileoManuscriptZoom.png" style="width:90%; margin-top: none; border: none; background: none; box-shadow: none;" />
Note:
Ces observations amèneront Galilée à rejeter l'hypothèse géocentrique (la terre est le centre de l'Univers et tout tourne autour d'elle) en faveur du système copernicien héliocentrique. Cela l'amènera indirectement (je « fais court ») et bien plus tard, le 22 juin 1633, a être condamné par l'inquisition, ce qui lui vaudra de finir ses jours en résidence surveillée.
+++
## Les armoires à notes de Placcius et Leibniz
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/Placcius_cabinet_TabIV.png" style="width:80%; margin-top: none; border: none; background: none; box-shadow: none;" />
Note:
Avec l'apparition de l'imprimerie, la demande de papier croît considérablement et le prix de celui-ci chute. En plus de l'emploi des codex avec support papier que nous venons de voir, de nombreux savants commencent à prendre leurs notes sur des « bouts de papier » qui deviendront plus tard des fiches.
Mais si prendre des notes en abondance sur des « bouts de papier », est très bien ! encore faut-il être capable de s'y retrouver. Vincent Placcius (1642-1699) et Gottfried Leibniz (1646-1716) s'étaient fait construire une armoire spéciale pour résoudre ce problème.
+++
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/Placcius_cabinet_TabIVzoom.png" style="width:20%; margin-top: none; border: none; background: none; box-shadow: none;" />
Note:
Cette armoire contenait une multitude de colonnes capables de tourner autour de leur axe. Un côté de la colonne permettait d'inscrire un ou des mots clés et le côté opposé comportait un crochet auquel était attaché les notes correspondantes.
Remarquez l'avantage des « bouts de papiers classés » de Placcius et Leibniz sur le _codex_ de Galilée : les premiers peuvent être facilement réordonnées.
+++
## Les dangers de l'abondance de notes : la triste fin de Fulgence Tapir
Un extrait de la fin de la préface de « L'île des pingouins » d'Anatole France, publié en 1908.
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/A_France_Pingouins.jpg" style="width:70%; margin-top: none; border: none; background: none; box-shadow: none;" />
Note:
Je ne résiste pas, pour vous prévenir contre une accumulation exagérée de notes, à vous lire un extrait du roman d'Anatole France « L'île des pingouins », une histoire parodique de la France. Dans la préface, le narrateur explique qu'il écrit l'histoire des Pingouins et que sa quête d'informations l'amène chez l'immense savant Fulgence Tapir. Cette visite va se solder par une catastrophe que le narrateur rapporte ainsi :
Les murs du cabinet de travail, le plancher, le plafond même portaient des liasses débordantes, des cartons démesurément gonflés, des boîtes où se pressait une multitude innombrable de fiches, et je contemplai avec une admiration mêlée de terreur les cataractes de l'érudition prêtes à se rompre.
—Maître, fis-je d'une voix émue, j'ai recours à votre bonté et à votre savoir, tous deux inépuisables. Ne consentiriez-vous pas à me guider dans mes recherches ardues sur les origines de l'art pingouin?
—Monsieur, me répondit le maître, je possède tout l'art, vous m'entendez, tout l'art sur fiches classées alphabétiquement et par ordre de matières. Je me fais un devoir de mettre à votre disposition ce qui s'y rapporte aux Pingouins. Montez à cette échelle et tirez cette boîte que vous voyez là-haut. Vous y trouverez tout ce dont vous avez besoin.
J'obéis en tremblant. Mais à peine avais-je ouvert la fatale boîte que des fiches bleues s'en échappèrent et, glissant entre mes doigts, commencèrent à pleuvoir. Presque aussitôt, par sympathie, les boîtes voisines s'ouvrirent et il en coula des ruisseaux de fiches roses, vertes et blanches, et de proche en proche, de toutes les boîtes les fiches diversement colorées se répandirent en murmurant comme, en avril, les cascades sur le flanc des montagnes. En une minute elles couvrirent le plancher d'une couche épaisse de papier. Jaillissant de leurs inépuisables réservoirs avec un mugissement sans cesse grossi, elles précipitaient de seconde en seconde leur chute torrentielle. Baigné jusqu'aux genoux, Fulgence Tapir, d'un nez attentif, observait le cataclysme; il en reconnut la cause et pâlit d'épouvante.
—Que d'art! s'écria-t-il.
Je l'appelai, je me penchai pour l'aider à gravir l'échelle qui pliait sous l'averse. Il était trop tard. Maintenant, accablé, désespéré, lamentable, ayant perdu sa calotte de velours et ses lunettes d'or, il opposait en vain ses bras courts au flot qui lui montait jusqu'aux aisselles. Soudain une trombe effroyable de fiches s'éleva, l'enveloppant d'un tourbillon gigantesque. Je vis durant l'espace d'une seconde dans le gouffre le crâne poli du savant et ses petites mains grasses, puis l'abîme se referma, et le déluge se répandit sur le silence et l'immobilité. Menacé moi-même d'être englouti avec mon échelle, je m'enfuis à travers le plus haut carreau de la croisée.
+++
## Le Navigateur et son livre de bord : Éric Tabarly
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/LivredebordpenduickV.JPG" style="width:70%; margin-top: none; border: none; background: none; box-shadow: none;" />
Note:
Ici, un cas en apparence plus anecdotique : le livre de bord d'Éric Tabarly lors de la trans-Pacifique de San-Francisco à Tokyo en 1969.
+++
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/LivredebordpenduickVzoom1.png" style="width:70%; margin-top: none; border: none; background: none; box-shadow: none;" />
Note:
Tabarly y note les événements « marquant ». Par exemple, le 21 mars à 23 h, le foc ballon est déchiré.
+++
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/LivredebordpenduickVzoom2.png" style="width:70%; margin-top: none; border: none; background: none; box-shadow: none;" />
Note:
Sur la page opposé il fait ses calculs de positions (il n'y avait pas de GPS à l'époque).
__Le cas du livre de bord n'est anecdotique qu'en apparence__.
Un projet européen a, en effet, été consacré, il y a une dizaine d'année, à une reconstruction des climats des océans atlantiques et indiens aux 17e et 18e siècles. Cette tentative de reconstruction s'est basée sur des *livre de bord* des navires des compagnies des Indes portugaises, espagnoles, hollandaises, anglaises et françaises.
De même, les livres de bord des « navires négriers » constituent une source d'information capitale pour l'estimation du nombre d'africains déportés vers les colonies de ce que les occidentaux désignaient par « Nouveau Monde » du 15e au 19e siècle (11 à 12 millions).
+++
## <span style="font-size:95%">Quel(s) support(s) matériel(s) pour les notes ?</span>
Doit-on utiliser :
- l'objet d'étude (comme pour le livre annoté)
- un ou des cahiers
- des fiches ou feuilles volantes stockées dans un classeur
- un ou des fichiers d'ordinateur
- des dessins ou photos
- des films
- ... ?
+++
## Comment s'y retrouver ?
Les notes posent un problème d'organisation :
- <span style="font-size:97%">Comment peut-on imposer une structure à nos notes après coup ? Est-ce seulement possible ?</span>
- <span style="font-size:97%">Peut-on les indexer, si oui, comment ?</span>
- <span style="font-size:97%">Comment peut-on les rendre pérennes tout en les faisant évoluer ?</span>
Note:
__En Introduction__
Les notes par nature disparates – par les sujets dont elles traitent et, souvent, par leurs supports matériels – posent un problème d'organisation.
__En conclusion__
__Il est clair que sans organisation, l'utilité des notes n'excède qu'à peine notre capacité à mémoriser des faits ou évènements.__
Dans le reste de ce module nous allons *proposer* des réponses aux questions que nous venons de poser dans ces deux dernières diapos.
---
# C028AL-W1-S2
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/clap.png" style="width:50%; margin-top: none; border: none; background: none; box-shadow: none;" />
+++
## 1. Cahier de notes / cahier de laboratoire
1. Nous utilisons tous des cahiers de notes
2. **Un aperçu historique de la prise de notes**
3. Du fichier texte au langage de balisage léger
- Démonstration : markdown
4. Pérennité et évolutivité des notes avec la gestion de version
- Démonstration : gitlab
5. Les étiquettes et les logiciels d'indexation pour s'y retrouver
- Démonstration : DocFetcher
Note:
Si nous devons tous prendre des notes, nos prédécesseurs ont dû le faire aussi. Cette constatation élémentaire va nous inciter à regarder comment nos brillants ancêtres s'y sont pris pour effectuer cette tâche.
+++
## De quoi allons-nous discuter ?
- de l'aspect concret de la prise de note – la « matérialité » des historiens –
- de l'organisation des livres et des notes
- du lien entre aspects matériels et organisationnels.
Note:
Notre discussion va porter en partie sur le livre puisque les éléments de navigation de ce dernier : table des matières, index, etc. ; s'applique aussi à l'organisation des notes.
Nous allons nous concentrer sur le « côté occidental » de l'histoire avec une seule page consacrée aux contributions chinoises et aucune aux contributions musulmanes, indiennes ou précolombiennes. Ce biais doit être interprété comme un reflet de mes ignorances et par la plus grande facilité d'obtenir des documents et illustrations concernant l'histoire du livre et de la prise de notes en Occident.
+++
## L'aspect matériel résumé sur une diapo
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/Figure_W1_S2_1.jpg" style="width:100%; margin-top: none; border: none; background: none; box-shadow: none;" />
Note:
En haut à gauche : une tablette d'argile avec des comptes (précunéiforme, vers -3000)
En haut au milieu : une fresque de Pompéi avec le portrait de Terentius Neo et sa femme. Elle porte une _tablette de cire_ et un _stylet_ (les outils principaux de prise de notes jusqu'au 19e siècle, ou presque), il porte un _volumen_, la support matériel du livre jusqu'au début de notre ère.
En haut à droite : un cahier de notes sur papier datant du milieu du 17e siècle et contenant des « lieux communs » au sens rhétorique du terme de « source générale communément admise d’où un orateur peut tirer ses arguments ».
En bas à gauche : une fiche, exemple d'un support de notes dont l'utilisation va « exploser » avec la bureaucratisation et le développement des bibliothèques. Ce support sera largement adopté dans les sciences humaines, mais il a d'abord été systématiquement employé et peut être même créé par le naturaliste Carl Linné, père de la _taxinomie_.
En bas au milieu : des « Post-it » comme nous sommes nombreux à en utiliser tous les jours.
En bas à droite : un ordinateur moderne utilisable comme une tablette (numérique cette fois).
+++
## Tablette de cire et stylet
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/tabula_stilus.jpg" style="width:100%; margin-top: none; border: none; background: none; box-shadow: none;" />
Note:
Les tablettes de cire (en latin tabulæ, planches) sont des supports d'écriture effaçables et réutilisables, connus depuis la haute Antiquité et qui ont été utilisés jusqu'au milieu du XIXe siècle.
La tablette de cire est formée d'une plaquette le plus souvent en bois (mais les nobles auront des tablettes en argent, ivoire, etc.). Elle est évidée sur presque toute sa surface en conservant un rebord de quelques millimètres qui fait cadre. De la cire est coulée dans la partie en dépression puis lissée. L'écriture se fait en gravant les caractères sur la cire à l'aide de l'extrémité pointue d'un instrument appelé style ou stylet. Ils peuvent être effacés en lissant la cire avec l'autre extrémité, plate, du stylet, après l'avoir ramollie.
La plus ancienne tablette connue provient d'un bateau mycénien et date du XIVe siècle av. J.-C. Les Grecs ont adopté la tablette par l'intermédiaire des Phéniciens en même temps que l'alphabet vers le VIIIe siècle av. J.-C..
En français l'expression « faire table rase » vient du latin _tabula rasa_, effacer la tablette.
Les ardoises et des tablettes de sable ont également été utilisées pour prendre des notes.
+++
## Du _volumen_ au _codex_
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/Figure_W1_S2_3.jpg" style="width:100%; margin-top: none; border: none; background: none; box-shadow: none;" />
Note:
Le passage du _volumen_ au _codex_ est absolument fondamentale pour l'avenir de la civilisation écrite.
Le _volumen_ est un livre à base de feuilles de papyrus collées les unes aux autres et qui s'enroule sur lui-même. Il a été créé en Égypte vers 3000 av. J.-C. Le texte est rédigé en colonnes parallèles assez étroites. C'est le support du texte par excellence durant les trente siècles précédant notre ère, d'abord en Égypte, puis dans tout le monde méditerranéen.
La mosaïque en bas à gauche représente Virgile (70-19 avant J.-C., assis) tenant un volume de l'Énéide et Clio, muse de l'Histoire, tenant elle aussi un _volumen_.
Comme l'explique Frédéric Barbier : « La forme du _volumen_ impose une pratique de lecture complexe : il faut dérouler (_explicare_) et enrouler en même temps, ce qui interdit par exemple, de travailler simultanément sur plusieurs rouleaux (un texte et son commentaire) ou de prendre des notes, impose une lecture suivie et empêche la simple consultation. »
Le _volumen_ n'est clairement pas adapté à une lecture « nomade » ; imagine-t-on Ulysse partant pour son Odyssée avec les 24 _volumen_ de l'Iliade ?
Le _volumen_ est à l'origine du terme « volume » dans un « livre en plusieurs volumes » comme dans la désignation du concept géométrique.
Le passage au codex repose sur deux innovations :
- la collection des tablettes de cires en « groupes reliés » ;
- la généralisation du parchemin (peau, généralement, de mouton spécialement préparée) au détriment du papyrus. Cette généralisation résulte une lutte pour l'hégémonie culturelle entre deux descendants de généraux d'Alexandre le Grand, en effet d'après Pline l'ancien : Ptolémé Épiphane d'Alexandrie cherchait à empêcher Eumène II d'établir une bibliothèque à Pergame (au 2e siècle avant J.-C.) et avait interdit l'exportation du papyrus (produit exclusivement en Égypte), ce qui incita Eumène à chercher un substitut qui devint le parchemin.
Le remplacement du rouleau par le codex aura des conséquences majeures sur l'organisation du livre ainsi que sur la façon de lire et il permettra le développement ultérieur de l'imprimerie.
La principale révolution introduite par le codex est la notion de page. Grâce à elle, le lecteur peut accéder de manière directe à un chapitre ou à un passage du texte, alors que le rouleau impose une lecture continue. __Les mots ne sont de plus pas séparés par des espaces__. Comme l'écrit Collette Sirat : « Il faudra vingt siècles pour qu’on se rende compte que l’importance primordiale du codex pour notre civilisation a été de permettre la lecture sélective et non pas continue, contribuant ainsi à l’élaboration de structures mentales où le texte est dissocié de la parole et de son rythme. »
Remarquez les lettres en rouge, résultat de la _rubrication_ (mot qui a donné notre « rubrique » moderne) utilisée pour séparer ce qui deviendra des paragraphes avec l'imprimerie. Cette dernière en effet utilisera des espaces blancs plutôt que des couleurs (trop chères) pour marquer des séparations. L'usage de la couleur constitue une technique de mise en page qui pourrait parfaitement être remise à l'ordre du jour avec l'informatique.
+++
## Eusèbe et les références croisées
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/Eusebe_final.jpg" style="width:80%; margin-top: none; border: none; background: none; box-shadow: none;" />
Note:
Au IVe siècle de notre ère, Eusèbe de Césarée ou Eusèbe (de) Pamphile est l'auteur de nombreuses œuvres historiques, apologétiques, bibliques et exégétiques. Auteur de l’Histoire ecclésiastique, il est reconnu comme un Père de l'Église, et ses écrits historiques ont une importance capitale pour la connaissance des trois premiers siècles de l'histoire chrétienne. Il va apporter plusieurs innovations capitales à l'organisation du livre dont la table de références croisées.
+++
## Canon eusébien
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/Evangeliaire_Lorsch.jpg" style="width:80%; margin-top: none; border: none; background: none; box-shadow: none;" />
Note:
Pour permettre une comparaison plus facile des quatre évangiles, il numérote les différents versets de chacun d'entre eux – sa numérotation n'est celle employée de nos jours qui, elle, date du XVIe siècle. Il indique les versets dont les contenus sont identiques dans les 4 évangiles (à gauche), ceux dont le contenu est identique dans 3 des 4 (à droite), dans 2 des 4, etc. Ce « canon eusébien » constitue le premier exemple connu de références croisées.
+++
## Importance du _codex_
D'après Frédéric Barbier dans l'« Histoire du livre » :
- L'invention du _codex_ est absolument fondamentale pour l'avenir de la civilisation écrite
- Le _codex_ se prête à la _consultation partielle_
- On peut lui superposer un système de références facilitant la consultation
- On peut consulter le _codex_ en prenant des notes
- La combinaison du _codex_ et de la minuscule donne un outil intellectuel très puissant, tel qu'il n'en existait pas antérieurement.
Note:
Au fil des siècles, le codex — qu'on désigne le plus souvent comme un manuscrit — va évoluer et se donner peu à peu les attributs du livre moderne : séparation entre les mots (VIIe siècle), début de ponctuation (VIIIe siècle), table des matières, titre courant, marque de paragraphe (XIe siècle), pagination, index (XIIIe siècle), etc.
Un point intéressant : le contenu de la Thora est « fixé » avant l'apparition du codex et, aujourd'hui encore, la Thora est écrite sur des _volumen_ (dans les synagogues au moins). La religion chrétienne se développe en même temps que le codex et ne donnera jamais au _volumen_ un statut « supérieur », pas plus que ne le fera la religion musulmane.
+++
## Parallèle chinois
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/Figure_W1_S2_6.jpg" style="width:90%; margin-top: none; border: none; background: none; box-shadow: none;" />
Note:
Le lien entre apparition et généralisation du _codex_, d'une part, et apparition des « outils de navigation », table des matières, index, titre courant etc., d'autre part à un pendant dans la civilisation chinoise.
En Chine, les concours d'entrée dans l'administration se développent au 9e siècle. L'épreuve principale de ceux-ci serait probablement appelée épreuve de culture générale de nos jours et demande aux candidat une connaissance approfondie des classiques, Confucius en tête, et la capacité de les citer.
Pour répondre à cette demande, des ouvrages spécialisés, sorte de florilèges, les leishu, vont se développer. Mais leur utilisation efficace doit permettre de trouver un ensemble de citations appropriées à un contexte donné suppose l'emploi d'index, de table des matières, etc. De façon intéressante, le _codex_ et les outils de navigation vont eux aussi se développer __de concert__ à partir de cette époque.
La majorité de ces leishus __est imprimée__ (dès le 9e siècle !), ce que rappelle la matrice d'impression à droite de la page. L'impression se fait bien sûr sur du papier, support inventé par les Chinois au 8e siècle avant J.-C....
+++
## Organiser en « mettant dans la bonne case »
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/Placcius_cabinet_TabIV.png" style="width:80%; margin-top: none; border: none; background: none; box-shadow: none;" />
Note:
Maintenant que nous avons très brièvement décrit l'apparition des principaux outils de navigations du livre – outils qui peuvent bien entendu s'appliquer aux notes prises dans un cahier – ; nous revenons sur le « bout de papier » ou la fiche comme support de note.
Nous montrons à nouveau l'armoire à notes de Placcius et Leibniz puisqu'elle évoque parfaitement les inconvénients et les avantages des supports ne contenant __qu'une seule note__.
L'inconvénient est que le bout de papier ou la fiche se perdent facilement et ne servent à rien s'ils ne sont pas __classés__ en plus d'être rangés. Problème résolu par l'armoire de la figure. D'une certaine façon, sa conception fait qu'on accède à son contenu par l'index.
L'avantage est que les notes peuvent être réorganisées si elles contiennent des information sur plusieurs sujets. Elle peuvent aussi être directement collées dans un livre lors de la composition d'un florilège ou d'un ouvrage de synthèse.
Ce dernier procédé était très couramment employé par les humanistes et les érudit de la renaissance et du début de la période moderne. [Conrad Gessner](https://fr.wikipedia.org/wiki/Conrad_Gessner) (1516-1565) était un champion de cette technique ; il obtenait même parfois ses fiches en découpant les pages des livres. Encore une fois, ne faites pas cela avec les livres de bibliothèques !
+++
## Organiser avec une bonne « carte » : la méthode de John Locke
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/MethodeLocke1.jpg" style="width:80%; margin-top: none; border: none; background: none; box-shadow: none;" />
Note:
Nous allons maintenant apprendre une technique de construction d'index due à [John Locke](https://fr.wikipedia.org/wiki/John_Locke) (1632-1704), grand-père du libéralisme, ce qui ne l'empêchait pas d'être actionnaire de la _Royal African Company_, [principale compagnie négrière anglaise](https://en.wikipedia.org/wiki/John_Locke#Constitution_of_Carolina)...
J'illustre la méthode avec mon cahier de notes. Les deux pages décrivent l'organisation d'un jeu de données dans un fichier au format [HDF5](https://www.hdfgroup.org/) sur la page de gauche et l'organisation correspondante dans un `data frame` du logiciel [R](https://www.r-project.org/) sur la page de droite. Les données concernent la mesure de la concentration des ions calcium dans des neurones et ces notes ont été prises lors du développement d'un code (programme d'ordinateur) pour les analyser.
Pour l'application de la méthode de Locke, ce n'est pas le contenu des pages qui nous importent directement, mais les fait qu'elles sont numérotées (en bas dans les coins externes, ici nous avons affaire aux pages 86 et 87) et qu'elles comportent des mots clé : `code` ; `neuro` ; `calcium` ; inscrits en rouge en bas des pages.
Je signale que la méthode de Locke peut être mise en œuvre après coup. Je l'ai en fait testée lors de la préparation de ce cours, c'est-à-dire après avoir commencé à remplir mon cahier de notes.
+++
## La méthode de John Locke (suite)
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/MethodeLocke2.jpg" style="width:80%; margin-top: none; border: none; background: none; box-shadow: none;" />
Note:
Nous voyons maintenant notre index. Il est situé en fin de cahier, même si Locke recommande de le placer au début, parce-que je ne l'avais pas planifié comme je viens de l'expliquer.
L'idée est de référencer les mots clé du cahier en se basant sur leur première lettre et sur la première voyelle suivant la première lettre.
L'index est ainsi décomposé en 26 entrées principales, les lettres capitales de A à R visibles sur les deux pages, et chaque entrée principale est elle-même subdivisée suivant les 5 voyelles les plus courantes (par convention le y sera alors classé avec le i).
Les pages 86 et 87 que nous venons de voir comportaient le mot clé `code` et nous voyons qu'elles figurent sur la ligne `Co`, elle comportaient le mot clé `neurone` et elles figurent également sur la ligne `Ne` ; enfin elle comportaient le mot clé `calcium` et figurent donc sur la ligne `Ca`.
Si besoin, on peut aussi lister les mots clé avant ou après l'index lorsque le cahier est fini.
+++
## Conclusions
- Comme il est rarement possible de se passer complètement d'un support papier, apprendre de nos brillants prédécesseurs devrait nous permettre de ne pas « réinventer la roue »
- Clairement nous avons néanmoins intérêt à utiliser autant que possible un support numérique pour profiter (en nous inspirant de ces mêmes prédécesseurs) :
+ d'une plus grande flexibilité d'organisation, de réorganisation et de structuration
+ d'outils d'archivage fiables
+ d'outils d'indexation puissants.
---
# C028AL-W1-S3
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/clap.png" style="width:50%; margin-top: none; border: none; background: none; box-shadow: none;" />
+++
## 1. Cahier de notes / cahier de laboratoire
1. Nous utilisons tous des cahiers de notes
2. Un aperçu historique de la prise de notes
3. **Du fichier texte au langage de balisage léger**
- Démonstration : markdown
4. Pérennité et évolutivité des notes avec la gestion de version
- Démonstration : gitlab
5. Les étiquettes et les logiciels d'indexation pour s'y retrouver
- Démonstration : DocFetcher
Note:
Nous commençons à présent une discussion plus « technique » dirigée principalement vers les outils que l'informatique met à notre disposition pour prendre des notes avec les notions de « fichier texte » et de « langage de balisage léger ».
+++
## Qu'est-ce qu'un fichier texte ?
- De façon pratique, un « [fichier texte](https://fr.wikipedia.org/wiki/Fichier_texte) » _donne quelque chose de lisible_ lorsqu'il est ouvert avec un [éditeur de texte](https://fr.wikipedia.org/wiki/%C3%89diteur_de_texte).
- Un « éditeur de texte » permet de créer et de modifier des fichiers
textes (belle définition circulaire !) :
+ [Notepad++](https://notepad-plus-plus.org/) pour `Windows`
+ [gedit](https://wiki.gnome.org/Apps/Gedit) pour les systèmes `Unix / Linux` (mais pas seulement)
+ [TextEdit](https://en.wikipedia.org/wiki/TextEdit) pour les `MacOS`.
Note:
Nous ne citons ici, délibérément, que des logiciels libres (il est difficile de faire de la recherche vraiment reproductible avec des logiciels non libres).
Un logiciel de « [traitement de texte](https://fr.wikipedia.org/wiki/Traitement_de_texte) » est plus sophistiqué qu'un simple éditeur de texte ; il permet de faire plus, ce qui sous entend qu'il peut aussi ouvrir et manipuler des fichiers textes.
**Attention** : le format « natif » des traitements de texte est rarement un format texte. Les fichiers `doc` et `docx` de `Word` et `odt` de `LibreOffice` _ne sont pas des fichiers textes_.
+++
## Un fichier « non lisible » avec un éditeur de texte
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/Exemple_Fichier_Binaire.png" style="width:80%; margin-top: none; border: none; background: none; box-shadow: none;" />
Un fichier `PDF` ouvert avec `gedit`
+++
## Un fichier « texte » ouvert avec un éditeur de texte
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/Exemple_Fichier_Texte.png" style="width:80%; margin-top: none; border: none; background: none; box-shadow: none;" />
+++
## Pourquoi utiliser des fichiers texte ?
Les caractères contenus dans le fichier texte sont typiquement codés en [UTF-8](https://fr.wikipedia.org/wiki/UTF-8) (_Universal Character Set Transformation Format - 8 bits_).
**Cela implique que** :
- il est _toujours possible_ de les lire avec un éditeur de texte _même des années plus tard_
- les logiciels d'indexation ou de « [recherche de bureau](https://en.wikipedia.org/wiki/Desktop_search) », comme les logiciels de [gestion de versions](https://fr.wikipedia.org/wiki/Gestion_de_versions), les exploitent pleinement.
**Conclusion : choisissez le format texte (UTF-8)**.
+++
## Problème du fichier texte « simple »
- Avec un fichier texte « simple » il n'est pas possible de profiter des outils de navigation comme les hyperliens.
- De même, il n'est pas possible de mettre en évidence un mot ou un groupe de mots avec une police **grasse** ou une police *italique*.
- Si plusieurs personnes travaillent sur un même texte, elles ne peuvent se corriger en ~~barrant~~ des mots.
+++
## Un fichier `HTML` visualisé avec un navigateur
<br/>
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/Exemple_Rendu_HTML.png" style="width:80%; margin-top: none; border: none; background: none; box-shadow: none;" />
Note:
Ces limitations, combinées aux avantages des fichiers textes, ont amenées les informaticiens à développer des [langages de balisages](https://fr.wikipedia.org/wiki/Langage_de_balisage) (_Markup Language_ en anglais).
Un exemple banale est le [langage HTML](https://fr.wikipedia.org/wiki/Hypertext_Markup_Language).
+++
## Un fichier `HTML` visualisé avec un éditeur de texte
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/Exemple_Source_HTML.png" style="width:80%; margin-top: none; border: none; background: none; box-shadow: none;" />
Note:
Ces langages définissent une collection de balises qui ne sont pas (typiquement) destinées à être lues par un humain, mais à être interprétées par un logiciel.
Retrouvons le texte du début de la page précédente : « En informatique les langages de balisage... ».
Remarquez la syntaxe qui permet d'introduire un commentaire dans le fichier source. Un commentaire est un élément de texte qui ne sera pas interprété par le logiciel de visualisation.
+++
Le problème se résume ainsi :
- Fichiers texte attractifs pour la prise de notes.
- Langages de balisages ⇒ meilleur confort de lecture des fichiers _avec logiciel « de rendu »_.
- Langages de balisages ⇒ fichiers source au format texte, __mais__ nécessitent éditeurs spécialisés.
Peut-on combiner la légèreté des fichiers textes « simples » avec le confort de lecture offert par les langages de balisage ?
Note:
Le problème se résume ainsi :
- Les fichiers textes sont très attractifs pour la prise de notes.
- Les langages de balisages comme l'`HTML` nous permettent d'améliorer considérablement le confort de lecture de nos fichiers _à condition d'utiliser un logiciel « de rendu » adapté_.
- Les langages de balisages comme l'`HTML` génèrent des fichiers sources au format texte, mais avec lesquels il est difficile (pénible) de travailler et nécessitent des éditeurs spécialisés – ce qui ralentit l'écriture des notes –.
Peut-on combiner la légèreté des fichiers textes « simples » avec le confort de lecture offert par les langages de balisage ?
+++
## Langage de balisage léger : l'idée
Un [langage de balisage léger](https://fr.wikipedia.org/wiki/Langage_de_balisage_l%C3%A9ger) est :
- un type de langage de balisage utilisant une _syntaxe simple_
- conçu pour qu'un fichier en ce langage soit _aisé à saisir_ avec un éditeur de texte simple
- _facile à lire dans sa forme non formatée_, c'est-à-dire sans logiciel dédié comme un navigateur internet.
+++
## L'exemple de `Markdown`
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/Exemple_Markdown.png" style="width:70%; margin-top: none; border: none; background: none; box-shadow: none;" />
Markdown source (en haut) et sortie HTML (en bas)
Note:
Markdown nous permet aussi de structurer facilement nos notes avec des sections, sous-sections, etc.
Les hyperliens peuvent être aussi bien avoir des cibles externes, comme illustré ici, qu'interne.
Il est possible d'inclure des commentaires.
+++
## `Markdown` n'est pas le seul langage de balisage léger disponible
- Le plus communément employé est [`Wikitexte`](https://fr.wikipedia.org/wiki/Wikitexte) de Wikipédia
- [AsciiDoc](http://www.methods.co.nz/asciidoc/) a de nombreux adeptes
- [ReStructuredText](http://docutils.sourceforge.net/docs/user/rst/quickstart.html) est très employé par la communauté des programmeurs `Python`
- Il y en a bien d'autres.
+++
## Conclusions
Les langages de balisage léger vont nous permettre de :
- travailler avec des fichiers textes
- écrire rapidement nos notes, avec n'importe quel éditeur, grâce à leur syntaxe simplifiée
- organiser nos notes en les structurant.
Note:
Dans la partie approfondissements, nous montrons :
- comment obtenir n'importe quel format « de sortie » (`HTML`, `PDF`, `docx`, `Wikitexte`) à partir d'un seul « fichier source » au format `Markdown` ;
- que le langage de balisage léger choisi importe peu puisque nous disposons d'un outil pour convertir l'un dans n'importe quel autre.
---
## C028AL-W1-S4
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/clap.png" style="width:50%; margin-top: none; border: none; background: none; box-shadow: none;" />
+++
## 1. Cahier de notes / cahier de laboratoire
1. Nous utilisons tous des cahiers de notes
2. Un aperçu historique de la prise de notes
3. Du fichier texte au langage de balisage léger
- Démonstration : markdown
4. **Pérennité et évolutivité des notes avec la gestion de version**
- Démonstration : gitlab
5. Les étiquettes et les logiciels d'indexation pour s'y retrouver
- Démonstration : DocFetcher
Note:
Nous allons maintenant discuter de la façon dont l'informatique nous permet de conserver nos notes de façon « sûr » tout en nous permettant de les faire évoluer.
Les outils dont nous allons parler concernent encore une fois une communauté beaucoup plus large que celle de la « recherche reproductible ». Toute personne amenée à « travailler » son texte s'y trouve confrontée, cela d'autant plus que la rédaction est de plus en plus effectuée en commun.
La problème de la pérennité des notes et des textes ne constitue en rien une nouveauté.
Pour les humanistes et les savants du début de l'ère moderne qui se spécialisaient dans la compilation de textes, elle était une véritable obsession et la justification de leur travail.
La solution qu'ils préconisaient alors, la copie multiple, est identique à celle que nous employons aujourd'hui, seul le support à changer.
Restons modestes, le support papier des humanistes a démontré sa capacité à résister à l'épreuve du temps.
Par contre, en ce qui concerne l'évolutivité, nous avons quelques raisons de penser que nos outils modernes constituent un véritable progrès.
+++
## L'évolutivité avec un support papier
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/Pierre_Ambroise_Choderlos_de_Laclos_Les_Liaisons_dangereuses.png" style="width:40%; margin-top: none; border: none; background: none; box-shadow: none;" />
Note:
Ici, l'exemple du manuscrit des « Liaisons dangereuses » de Pierre Ambroise Choderlos de Laclos.
L'auteur a apporté de nombreuses corrections à son manuscrit.
On conçoit que le nombre de corrections qu'il peut ainsi apporter est relativement restreint.
+++
## L'évolutivité avec traitement de texte
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/LibreOffice_notes_pour_CLOM_diff_origine.png" style="width:100%; margin-top: none; border: none; background: none; box-shadow: none;" />
Note:
Une solution qui permet de travailler lorsqu'on utilise que des fichiers texte est le suivi de modifications proposé par la plupart des logiciels de traitement de texte.
Ce n'est pas la solution que nous préconisons, mais c'est certainement le type de « gestion de version » auquel les utilisateurs d'ordinateurs ont le plus de chances d'avoir été exposés.
Nous prenons ici un exemple avec `LibreOffice` où nous éditons un fichier contenant des notes prises pour préparer ce cours.
Remarquez les boutons en bas à gauche que nous faisons apparaître en navigant dans les menu _view_ puis _Toolbars_ avant de sélectionner _track changes_.
- solution « facile » à mettre en œuvre
- pas de format texte
- faire attention à ne garder __que la dernière version__ avant de soumettre un article (pour les scientifiques)
- les sauvegardes doivent être gérées séparément.
+++
## L'évolutivité avec un « moteur de wiki »
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/Dokuwiki_notes_pour_CLOM.png" style="width:100%; margin-top: none; border: none; background: none; box-shadow: none;" />
Note:
Une solution plus proche de l'esprit de ce cours est l'emploi d'un _wiki_ pour gérer ses notes.
Ici, j'illustre l'usage d'un wiki personnel utilisant _DokuWiki_ comme moteur de wiki, j'aurais aussi pu utiliser _MediaWiki_, le moteur de Wikipédia.
_DokuWiki_ n'emploie que des fichiers texte.
Je l'ai appris lors de la préparation de ce cours, ce qui signifie qu'il est assez simple à utiliser.
Encore une fois, les notes prises en préparation du cours sont utilisées pour illustration.
+++
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/Dokuwiki_notes_pour_CLOM_historique2.png" style="width:100%; margin-top: none; border: none; background: none; box-shadow: none;" />
Note:
Si je clique sur « Derniers changements », alors je vois apparaître la liste des pages de mon wiki avec les dates des dernières modifications. Si maintenant je clique sur le nom de l'une des pages...
+++
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/Dokuwiki_notes_pour_CLOM_diff.png" style="width:100%; margin-top: none; border: none; background: none; box-shadow: none;" />
Note:
Je vois apparaître la différence entre la dernière version, à gauche, et la version présente à droite.
Commenter plus...
Vous avez accès à des informations du même type sur n'importe quelle page wikipédia.
+++
## Avantages et inconvénients
- solution qui a fait ses preuves, en particulier dans un cadre collaboratif
- format texte (avec `DokuWiki`)
- ne permet de modifier qu'une seule page à la fois
+++
## L'évolutivité avec la gestion de version
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/Github_Module1.png" style="width:100%; margin-top: none; border: none; background: none; box-shadow: none;" />
Note:
Je présente maintenant la solution la plus sophistiquée à ce jour.
Ici, un logiciel spécifique, _git_ est employé pour gérer les versions successives d'un ensemble de fichiers de nature disparate (des fichiers textes, des images, etc). En fait des arborescence de fichiers peuvent être gérées par ce logiciel.
Les logiciels comme _git_ nécessite la création d'un dépôt, qui peut être la machine de l'utilisateur, mais qui est en général hébergé sur un site internet dédié comme ici _GitHub_.
Le dépôt va permettre à différentes personnes de travailler sur le même « projet ». Elles vont échanger leur modifications via le dépôt. __Elles auront néanmoins toutes une copie complète de ce dernier__ (datant de leur dernière « synchronisation »).
Des nombreux instituts de recherche fournissent maintenant de tels dépôts aux laboratoires qui leurs sont rattachés.
Les utilisateurs peuvent alors souvent employer une interface graphique pour naviguer dans leurs dépôts, revenir sur des version antérieures, faire des comparaisons, des recherches, etc.
Nous voyons ici l'interface fourni par _GitHub_ et nous visualisons un état antérieur du fichier source de cette présentation.
Vous pouvez tous vous connectez à _Github_, aller sur le dépôt que nous avons utilisé pour préparer le cours, et refaire ce qui est montré dans les quelques diapos qui suivent.
Si je clique sur le bouton _History_, je vois...
+++
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/Github_Module1_historique.png" style="width:100%; margin-top: none; border: none; background: none; box-shadow: none;" />
Note:
Encore une fois, la liste des modifications apportées au fichier avec le nom de la personne ayant effectué ces modifications et les dates associées.
Si maintenant je clique sur le numéro 5a2951f, je vois...
+++
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/Github_Module1_diff.png" style="width:100%; margin-top: none; border: none; background: none; box-shadow: none;" />
Note:
Les différences entre la version précédente et la version identifiée par le numéro sur lequel j'ai cliqué.
Commentez...
+++
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/Git_diff_mixte.png" style="width:100%; margin-top: none; border: none; background: none; box-shadow: none;" />
Note:
Lorsque plusieurs fichiers ont été modifiés, comme ici où un fichier image a été rajouté et un fichier texte a été modifié, l'ensemble des modifications est visible et accessible.
+++
## Avantages et inconvénients
- Solution sophistiquée (donc un peu plus difficile à maîtriser que les précédentes)
- Solution qui a fait ses preuves, en particulier dans un cadre collaboratif sur de grands projets (noyau Linux)
- Permet d'enregistrer des modifications sur plusieurs fichiers à la fois
- Une sauvegarde centralisée dont tous les membres du projet ont une copie intégrale
Note:
Dans la partie approfondissements, nous rentrerons un peu plus dans les aspects concrets de l'utilisation de `git`.
`git` devient de fait le standard de la gestion de version bien au-delà des projets purement logiciels, cela vaut donc la peine de faire un petit effort pour en maîtriser les rudiments.
Quelque soit la stratégie de gestion de version employée, le retour en arrière est possible, mais lors des premières tentatives il vous faudra faire preuve de calme et de patience !
---
## C028AL-W1-S5
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/clap.png" style="width:50%; margin-top: none; border: none; background: none; box-shadow: none;" />
+++
## 1. Cahier de notes / cahier de laboratoire
1. Nous utilisons tous des cahiers de notes
2. Un aperçu historique de la prise de notes
3. Du fichier texte au langage de balisage léger
- Démonstration : markdown
4. Pérennité et évolutivité des notes avec la gestion de version
- Démonstration : gitlab
5. **Les étiquettes et les logiciels d'indexation pour s'y retrouver**
- Démonstration : DocFetcher
Note:
Nous revenons ici sur le problème de l'indexation, pas tant sur l'indexation d'un document unique que sur l'indexation de documents multiples dans des formats divers.
- comme nous l'avons déjà affirmé, prendre des notes abondantes et détaillées n'est utile que si nous pouvons retrouver les informations qu'elles contiennent quand nous en avons besoin
- pour des notes contenues dans un seul fichier texte, la fonction de recherche de notre éditeur favori nous permet généralement d'aller assez loin
- pour des notes manuscrites contenues dans un cahier, la méthode de Locke — que nous avons exposée dans notre deuxième séquence — et qui repose sur des mots clé ou étiquettes, donne de bons résultats
- les notes manuscrites sur fiches sont généralement stockées dans un meuble dont la structure matérialise un index — comme l'armoire de Placcius et Leibniz —
+++
## Ainsi parlait Leibniz
« Il me semble que l'apparat savant contemporain est comparable à un grand magasin qui contient une grande quantité de produits, stockés de façon totalement désordonnée, mélangée ; où les nombres ou lettres d'indexation manquent ; où les inventaires et livres de comptes pouvant aider à ordonner le contenu ont disparu.
Plus grande est la quantité d'objets amassés, plus petite est leur utilité. Ainsi, ne devrions nous pas seulement essayer de rassembler de nouveaux objets de toutes provenances, mais nous devrions aussi essayer d'ordonner ceux que nous avons déjà. »
Note:
J'emploie ici le terme d'« [apparat savant](https://fr.wikipedia.org/wiki/Apparat_savant) » qui est un terme technique de l'édition désignant : citations, références et sources, notes en bas de pages, introduction, texte en langue originale (en parallèle avec la traduction), commentaire historique ou philologique, index fontium (les sources), index locorum (références avec renvoi à la page où le passage est cité ou mentionné, par ex. : Évangile selon Marc 1, 1 : p. 100), index nominum (les noms propres), index rerum (les thèmes), etc.
"It seems to me that the apparatus of contemporary scholarship is comparable to a very large store which, though it keeps a great variety of goods, yet is totally confused and in disorder, because all items are mixed up, because no numbers or letters of an index are displayed, and because inventories or account ledgers which could throw some light on the matter are missing.
"The larger the mass of collected things, the less will be their usefulness. Therefore, one should not only strive to assemble new goods from everywhere, but one must endeavor to put in the right order those that one already possesses."
http://www.backwordsindexing.com/index.html
+++
## S'y retrouver dans un fichier texte
<img src="assets/img/recherche-avec-editeur.png" style="width:100%; margin-top: none; border: none; background: none; box-shadow: none;" />
+++
## S'y retrouver dans un cahier
<img src="assets/img/IndexCahierLocke.jpg" style="width:80%; margin-top: none; border: none; background: none; box-shadow: none;" />
+++
## S'y retrouver dans des « fiches »
<img src="assets/img/Placcius_cabinet_TabIV.png" style="width:100%; margin-top: none; border: none; background: none; box-shadow: none;" />
+++
## Problèmes, limitations, solutions ?
<br/>
- Un seul document
<br/>
- Indexation de fichiers numériques
<br/>
- Étiquetage de fichiers numériques au sens large
<br/>
- Moteur de recherche pour indexation et recherche globale
Note:
- les techniques que nous venons de voir ou revoir ne fonctionnent que pour un seul « document » — recherche avec l'éditeur de texte, index d'un cahier — et/ou pour un seul type de document
- les outils informatiques dont nous disposons nous permettent d'aller plus loin dans l'indexation des fichiers numériques
- il est possible de rajouter des étiquettes ou mots-clés à des fichiers textes comme à des fichiers images (`jpg`, `png`) ou des fichiers « mixtes » (`pdf`) grâce aux métadonnées qu'ils contiennent
- les moteurs de recherche de bureau permettent d'indexer l'ensemble des fichiers textes d'une arborescence donnée mais aussi les métadonnées des autres fichiers
+++
## Trouver un mot quelconque avec un moteur de recherche de bureau (`DocFetcher`)
<img src="assets/img/Trouver_un_mot_avec_DocFetcher.png" style="width:100%; margin-top: none; border: none; background: none; box-shadow: none;" />
+++
## Le problème de l'« abondance » &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<img src="assets/img/Trouver_calcium_avec_DocFetcher.png" style="width:100%; margin-top: none; border: none; background: none; box-shadow: none;" />
+++
## Ajouter des étiquettes ou mots clés dans un fichier texte (`Markdown`)
<img src="assets/img/Ajout_etiquette_avec_Markdown.png" style="width:100%; margin-top: none; border: none; background: none; box-shadow: none;" />
+++
## Trouver une étiquette avec un moteur de recherche de bureau (`DocFetcher`)
<img src="assets/img/Trouver_etiquette_avec_DocFetcher.png" style="width:100%; margin-top: none; border: none; background: none; box-shadow: none;" />
+++
## Les fichiers images contiennent des métadonnées
<img src="assets/img/Metadonne_fichier_index.jpg" style="width:100%; margin-top: none; border: none; background: none; box-shadow: none;" />
+++
## Les métadonnées peuvent être modifiées &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<img src="assets/img/Metadonne_fichier_index2.jpg" style="width:100%; margin-top: none; border: none; background: none; box-shadow: none;" />
+++
## Les moteurs de recherche de bureau peuvent lire les métadonnées
<img src="assets/img/Trouver_etiquette_avec_DocFetcher2.jpg" style="width:100%; margin-top: none; border: none; background: none; box-shadow: none;" />
+++
## Conclusion
En combinant :
- des étiquettes insérées dans nos fichiers textes, images, `PDF`, etc
- avec un moteur de recherche de bureau
nous pouvons espérer éviter le « cauchemar de Leibniz »
#+OPTIONS: ':nil *:t -:t ::t <:t H:3 \n:nil ^:t arch:headline
#+OPTIONS: author:t broken-links:nil c:nil creator:nil
#+OPTIONS: d:(not "LOGBOOK") date:t e:t email:nil f:t inline:t num:t
#+OPTIONS: p:nil pri:nil prop:nil stat:t tags:t tasks:t tex:t
#+OPTIONS: timestamp:t title:t toc:t todo:t |:t
#+TITLE: Une phrase de description pour les séquences du module 1
#+DATE: <2018-07-05 jeu.>
#+AUTHOR: Christophe Pouzat
#+EMAIL: christophe.pouzat@parisdescartes.fr
#+LANGUAGE: en
#+SELECT_TAGS: export
#+EXCLUDE_TAGS: noexport
#+CREATOR: Emacs 25.3.1 (Org mode 9.0.9)
* Séquence 1
- Quelques exemples, célèbres et moins célèbres, de prise de notes.
- Some famous and less famous examples of note-taking.
* Séquence 2
- Une courte histoire de la navigation dans le livre et les notes.
- A brief history of navigation within the book and notes.
* Séquence 3
- L'intérêt des fichiers textes et des langages de balisage légers.
- Why should we use text fromats and ligthweight markup languages?
* Séquence 4
- Comment archiver des notes tout en les faisant évoluer ? L'intérêt des logiciels de gestion de version.
- How to archive notes while letting them evolve? The case for version control systems.
* Sèquence 5
- S'y retrouver dans ses notes avec des mots-clés et un moteur de recherche de bureau.
- Finding one's way in a large notes collection with key-words and desktop search software.
# -*- ispell-local-dictionary: "american" -*-
#+TITLE: Lab books and note books
#+AUTHOR: @@latex:{\large Christophe Pouzat} \\ \vspace{0.2cm}MAP5, Paris-Descartes University and CNRS\\ \vspace{0.2cm} \texttt{christophe.pouzat@parisdescartes.fr}@@
#+LATEX_CLASS: beamer
#+LATEX_CLASS_OPTIONS: [presentation,bigger]
#+STARTUP: beamer indent
#+LANGUAGE: fr
#+PROPERTY: header-args :eval no-export
#+OPTIONS: H:2 tags:nil
#+OPTIONS: num:t toc:t \n:nil @:t ::t |:t ^:nil -:t f:t *:t <:t
#+OPTIONS: TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-toc
# #+OPTIONS: author:nil email:nil creator:nil timestamp:t
#+TAGS: noexport(n)
#+EXCLUDE_TAGS: noexport
#+LATEX_HEADER: \usepackage{pgfpages}
#+LATEX_HEADER: \setbeameroption{show notes on second screen=right}
#+LATEX_HEADER: \usepackage[normalem]{ulem}
#+LATEX_HEADER: \usepackage[normalem]{ulem}
#+LATEX_HEADER: \usepackage{svg}
#+LATEX_HEADER: \setbeamercovered{invisible}
#+LATEX_HEADER: \AtBeginSection[]{\begin{frame}<beamer>\frametitle{Where are we?}\tableofcontents[currentsection]\end{frame}}
#+LATEX_HEADER: \beamertemplatenavigationsymbolsempty
#+LATEX_HEADER: \usepackage{tikzsymbols}
#+LATEX_HEADER: \def\smiley{\Smiley[1][green!80!white]}
#+LATEX_HEADER: \def\frowny{\Sadey[1][red!80!white]}
#+LATEX_HEADER: \def\winkey{\Winkey[1][yellow]}
#+LATEX_HEADER: \usepackage{color,soul}
#+LATEX_HEADER: \definecolor{lightblue}{rgb}{1,.9,.7}
#+LATEX_HEADER: \sethlcolor{lightblue}
#+LATEX_HEADER: \newcommand{\muuline}[1]{\SoulColor\hl{#1}}
#+LATEX_HEADER: \makeatletter
#+LATEX_HEADER: \newcommand\SoulColor{%
#+LATEX_HEADER: \let\set@color\beamerorig@set@color
#+LATEX_HEADER: \let\reset@color\beamerorig@reset@color}
#+LATEX_HEADER: \makeatother
#+LATEX_HEADER: \let\hrefold=\href
#+LATEX_HEADER: \renewcommand{\href}[2]{\hrefold{#1}{\SoulColor\hl{#2}}}
# #+BEAMER_HEADER: \setbeamercovered{invisible}
# #+BEAMER_HEADER: \AtBeginSection[]{\begin{frame}<beamer>\frametitle{Where are we ?}\tableofcontents[currentsection]\end{frame}}
# #+BEAMER_HEADER: \beamertemplatenavigationsymbolsempty
#+STARTUP: beamer
#+COLUMNS: %45ITEM %10BEAMER_ENV(Env) %10BEAMER_ACT(Act) %4BEAMER_COL(Col) %8BEAMER_OPT(Opt)
#+STARTUP: indent
#+PROPERTY: header-args :eval no-export
* M1-S0: Lab books and note books
:PROPERTIES:
:CUSTOM_ID: c028al-w1-s0
:END:
** Lab books and note books
:PROPERTIES:
:CUSTOM_ID: les-grandes-lignes-du-module-cahier-de-notes-cahier-de-laboratoire
:END:
1. Note-taking Concerns Everyone
2. A Quick History of Note Taking
3. From Text Files to Lightweight Markup Languages
- Demo: markdown
4. Note Archiving and Evolution with Version Control
- Demo: gitlab
5. Labels and Search Engines
- Demo: DocFetcher
* M1-S1: Note-taking concerns everyone
** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
This section discusses a much wider issue than /reproducible research/ (RR). Implementing RR requires thorough note-taking and note-taking concerns everyone. The purpose of this section is therefore to remind the reader / auditor that he/she already knows: *note-taking concerns everyone*. Few examples are used to that end.
** The scholar annotating his book / manuscript
[[file:img/ManuscritAnnoteEtCoupe.png]]
#+BEGIN_EXPORT latex
\vspace{0.25cm}
#+END_EXPORT
A XIVth century manuscript with the works of Aristotle owned by Nicasius de Planca (gallica.bnf.fr / Bibliothèque nationale de France).
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
We see a manuscript from the XIVth century heavily annotated by its owner Nicasius de Planca. This kind of note-taking was and remains extremely common. You should nevertheless avoid it when reading books from a library or from your friends!
The next two slides show a case of paramount importance for the History of Science.
** Galileo observing Jupiter's moons
[[file:img/GalileoManuscriptCoupe.png]]
#+BEGIN_EXPORT latex
\vspace{0.25cm}
#+END_EXPORT
Galileo Galilei's notes while observing Jupiter in January 1610 with his telescope (Wikimedia Commons).
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
The first observation was done on January 7 1610. Galileo Galilei first thought that he found new stars close to Jupiter (see the [[https://en.wikipedia.org/wiki/Galileo_Galilei#Jupiter's_moons][Wikipedia page]]). But after several nights of observation, he realized that these "stars" were in fact circling around the planet, *they are satellites*! He named the group of four the Medicean stars, in honour of his future patron, Cosimo II de' Medici, Grand Duke of Tuscany, and Cosimo's three brothers (Wikipedia).
**
[[file:img/GalileoManuscriptZoom.png]]
#+BEGIN_EXPORT latex
\vspace{0.25cm}
#+END_EXPORT
The small "stars" are in fact orbiting around Jupiter, *they are doing what the Moon does around the Earth* (Wikimedia Commons).
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
These observations lead Galileo to reject the geocentric hypothesis in favor of the heliocentric one. This brought him much later, and after a somewhat tortuous path that I don't have the space to describe now, in front of the Inquisition that sentences him on June 22 1633 to house arrest, which he remained under for the rest of his life.
** Placcius' and Leibniz' closet
[[file:img/Placcius_cabinet_TabIV.png]]
#+BEGIN_EXPORT latex
\vspace{0.25cm}
#+END_EXPORT
Organizing notes Placcius' way (Placcius, Vincent, 1642-1699. /De arte excerpendi vom gelahrten Buchhalten/, 1689. Houghton Library, Harvard University.)
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
With printing appearance, demand for paper increased and paper's price ended up decreasing (after a large production increase). In addition to the use of the /codex/ with pages made of paper, many scholars started using paper slips.
But taking abundant notes on paper slips is good only if one can find efficiently retrieve this stored information when needed. Vincent Placcius (1642-1699) and Gottfried Leibniz (1646-1716) had a custom made closet to solve this retrieval problem. This example is discussed in Ann Blair's book /TOO MUCH TO KNOW/, Yale Univ. Press, 2010 (pp. 93-95).
**
***
:PROPERTIES:
:BEAMER_COL: 0.48
:BEAMER_ENV: block
:END:
#+ATTR_LATEX: :width 0.6\textwidth
[[file:img/Placcius_cabinet_TabIVzoom.png]]
***
:PROPERTIES:
:BEAMER_COL: 0.48
:BEAMER_ENV: block
:END:
Zoom on the columns of Placcius' cabinet. You can see the "front" (left column), the "side" (second from left) and the "back" (fourth from left).
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
This cabinet had many columns that could rotate about their (vertical) axis. The column's front was used to write what we would now call keywords relating to the content of the notes that were hooked on the column's back side.
Notice the advantage of these paper slips over Galileo's codex: with the former, notes can be reorganized.
** Beware of overabundance: Fulgence Tapir's disappearance
***
:PROPERTIES:
:BEAMER_COL: 0.48
:BEAMER_ENV: block
:END:
#+BEGIN_SRC shell :exports none :results hide
cd imgs && wget https://upload.wikimedia.org/wikipedia/commons/c/c1/Anatole_France_young_years.jpg
#+END_SRC
#+RESULTS:
#+ATTR_LATEX: :width 0.9\textwidth
[[file:img/Anatole_France_young_years.jpg]]
***
:PROPERTIES:
:BEAMER_COL: 0.48
:BEAMER_ENV: block
:END:
In 1908, [[https://en.wikipedia.org/wiki/Anatole_France][Anatole France]] (1844-1924) published "[[https://archive.org/stream/in.ernet.dli.2015.220207/2015.220207.Penguin-Island_djvu.txt][Penguin Island]]" a parody of French history.
By Photographer : Wilhelm Benque. Tucker Collection - New York Public Library Archives, Public Domain, https://commons.wikimedia.org/w/index.php?curid=16240632.
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
\scriptsize The text can be found /legally/ at several places, the
[[https://en.wikipedia.org/wiki/Project_Gutenberg][Project Gutenberg]] one is missing the "Preface", so don't use it, go to
one of the versions available on [[https://archive.org/search.php?query=title%3Apenguin%20island%20AND%20-contributor%3Agutenberg%20AND%20mediatype%3Atexts][Internet Archive]]:
https://tinyurl.com/MOOC-RR-penguin-island. The importance of the
preface in illustrated by the following two quotations:
#+BEGIN_QUOTE
\tiny One word more if you want your book to be well
received, lose no opportunity for exalting the virtues on
which society is based — attachment to wealth, pious sentiments, and especially resignation on the part of the poor,
which latter is the very foundation of order. Proclaim, sir,
that the origins of property — nobility and police — are treated in your history with the respect which these institutions
deserve. Make it known that you admit the supernatural
when it presents itself. On these conditions you will succeed
in good society.
#+END_QUOTE
\vspace{-1em}And more importantly for our subject:\vspace{-1em}
#+BEGIN_QUOTE
\tiny The idea occurred to me, in the month of June last year, to
go and consult on the origins and progress of Penguin art,
the lamented M. Fulgence Tapir, the learned author of the
‘Universal Annals of Painting, Sculpture and Architecture’
Having been shown into his study, I found seated before a
roll-top desk, beneath a frightful mass of papers, an amazingly short-sighted little man whose eyelids blinked behind
his gold-mounted spectacles.
To make up for the defect of his eyes his long and mobile
nose, endowed with an exquisite sense of touch, explored the
sensible world. By means of this organ Fulgence Tapir put
himself in contact with art and beauty. It is observed that in
France, as a general rule, musical critics are deaf and art
critics are blind. This allows them the collectedness necessary for æsthetic ideas. Do you imagine that with eyes capable
of perceiving the forms and colours with which mysterious
nature envelops herself, Fulgence Tapir would have raised
himself, on a mountain of printed and manuscript documents, to the summit of doctrinal spiritualism, or that he
would have conceived that mighty theory which makes the
arts of all tunes and countries converge towards the Institute
of France, their supreme end?
The walls of the study, the floor, and even the ceiling were
loaded with overflowing bundles, pasteboard boxes swollen
beyond measure, boxes in which were compressed an in-
numerable multitude of small cards covered with writing. I
beheld in admiration minted with terror the cataracts of
erudition that threatened to burst forth.
‘Master,’ said I in feeling tones, ‘I throw myself upon
your kindness and your knowledge, both of which are
inexhaustible. Would you consent to guide me in my
arduous researches into the origins of Penguin art?’
‘Sir,’ answered the Master, ‘I possess all art, you under-
stand me, all art, on cards classed alphabetically and in
order of subjects. I consider it my duty to place at your disposal all that relates to the Penguins. Get on that ladder and
take out that box you see above. You will find in it everything you require.’
I tremblingly obeyed. But scarcely had I opened the fatal
box than some blue cards escaped from it, and slipping
through my fingers, began to rain down. Almost immediately, acting in sympathy, the neighbouring boxes opened, and
there flowed streams of pink, green, and white cards, and by
degrees, from all the boxes, differently coloured cards were
poured out murmuring like a waterfall on a mountain side
in April. In a minute they covered the floor with a thick
layer of paper. Issuing from their inexhaustible reservoirs
with a roar that continually grew in force, each second increased the vehemence of their torrential fall. Swamped up
to the knees in cards, Fulgence Tapir observed the cataclysm
with attentive nose. He recognised its cause and grew pale
with fright
‘What a mass of art !’ he exclaimed.
I called to him and leaned forward to help him mount the
ladder which bent under the shower. It was too late. Overwhelmed, desperate, pitiable, his velvet smoking-cap and his
gold-mounted spectacles having fallen from him, he vainly
opposed his short arms to the flood which had now mounted
to his arm-pits. Suddenly a terrible spurt of cards arose and
enveloped him in a gigantic whirlpool. During the space of a
second I could see in the gulf the shining skull and little fat
hands of the scholar, then it closed up and the deluge kept
on pouring over what was silence and immobility. In dread
lest I in my turn should be swallowed up ladder and all I
made my escape through the topmost pane of the window.
#+END_QUOTE
** A sailor's logbook
[[file:img/LivredebordpenduickV.jpg]]
#+BEGIN_EXPORT latex
\vspace{0.25cm}
#+END_EXPORT
The logbook of Eric Tabarly during the San-Francisco / Tokyo transpacific ocean race in 1969.
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
This example is only superficially anecdotal. Information about the source can be found at: [[https://commons.wikimedia.org/wiki/File:LivredebordpenduickV.JPG]].
**
#+ATTR_LATEX: :width 0.9\textwidth
[[file:img/LivredebordpenduickVzoom1.png]]
#+BEGIN_EXPORT latex
\vspace{0.25cm}
#+END_EXPORT
On the left side, Tabarly reports salient events like a ripped jib on March 21 at 11 pm.
**
#+ATTR_LATEX: :width 0.8\textwidth
[[file:img/LivredebordpenduickVzoom2.png]]
#+BEGIN_EXPORT latex
\vspace{0.25cm}
#+END_EXPORT
On the right side, he computes his position (that was before GPS time!).
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
This example is only superficially anecdotal. Ten years ago, a European project was aiming at estimating the Atlantic and Indian Oceans climates during the 18th century using logbooks from ships of the West- and East-India companies from the Kingdoms of Portugal, Spain, Holland, Britain and France. See the [[http://webs.ucm.es/info/cliwoc/][Climatological Database for the World's Oceans 1750-1850]].
In the same vein, logbooks from slave ships give a lot of quantitative information about the slave trade between Africa and the "New World".
** So, what should we use to take notes?
- The object of study (like the annotated book)?
- One or several notebooks?
- Paper slips or cards?
- Computer files?
- Drawings, Pictures?
- Films?
- ...?
** Avoid getting lost
Notes generate an organizational problem:
#+BEGIN_EXPORT latex
\vspace{0.25cm}
#+END_EXPORT
- How can we structure our notes?
- Can we index them, if yes, how?
- How can we archive them while keeping the capability to make them evolve?
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
Notes are necessarily heterogeneous---because of their subject matter as well as, often, their material support---and that creates a *serious* organizational problem.
*Without organization, notes usability barely exceeds our capability of memorizing facts and events*.
In the sequel we are going to give /tentative/ answers to the questions raised in the last two slides.
* M1-S2: Note-taking: a quick history
** Since note-taking concerns everyone...
- Since we are all "note-takers", our predecessors were also note-takers.
- This elementary observation will lead us to "study" how our brilliant ancestors took notes.
- Hopefully, we can learn some useful techniques on the way and put them to daily use.
- Hopefully, we can avoid thinking that we are the first to face the kind of problem we are now facing: "information overload".
** What are we going to talk about?
- The practical aspect of note-taking---what historians dub "materiality"---.
- The organization of books and notes.
- The link between the concrete and organizational aspects.
#+BEGIN_EXPORT latex
\vspace{0.2cm}
#+END_EXPORT
We are going to discuss the organization of books a lot since the "navigation devices" designed for the latter:
- table of content,
- index,
- etc,
also apply to notes.
*** Clarification
:PROPERTIES:
:BEAMER_ENV: note
:END:
We will mostly refer to the "Western" part of this History, with a single slide on Chinese contributions and nothing on Muslim, Indian or pre-Colombian contributions. This bias must be clearly understood as a *reflection of my ignorance* (I'm actively learning on the subject) and because it's easier, as always, to find illustrative material for "Western" contributions...
** The concrete aspects summarized on a single slide
#+ATTR_LATEX: :width 1.0\textwidth
[[file:img/Figure_W1_S2_1.jpg]]
*** Details
:PROPERTIES:
:BEAMER_ENV: note
:END:
\scriptsize All illustrations are taken from Wikimedia Commons
- Top left: A clay tablet (pre-cuneiform period, -3000).
- Top center: A fresco from Pompeii with the portrait of [[https://en.wikipedia.org/wiki/Portrait_of_Paquius_Proculo][Terentius Neo and his wife]]. She carries a [[https://en.wikipedia.org/wiki/Wax_tablet][wax tablet]] and a /stylus/ (the main medium of note-takers up to the 19th century); he carries a /volumen/ or [[https://en.wikipedia.org/wiki/History_of_scrolls][scroll]], the stuff of books until the beginning of the Common Era.
- Top right: a notebook made of paper from the 17th century with [[https://en.wikipedia.org/wiki/Commonplace_book][commonplaces]]. "Commonplace" is a translation of the Latin term locus communis (from Greek tópos koinós, see literary topos) which means "a theme or argument of general application", such as a statement of proverbial wisdom (Wikipedia).
- Bottom left: An [[https://en.wikipedia.org/wiki/Index_card][index card]], a notes medium whose use exploded with bureaucratization and the development of libraries. Still heavily used in the humanities. Apparently first used (if not created) by the father of taxonomy, [[https://en.wikipedia.org/wiki/Carl_Linnaeus][Carl Linneaus]]. You can find his cards at: [[http://linnean-online.org/61332/#/0]].
- Bottom center: A [[https://en.wikipedia.org/wiki/Post-it_note][Post-it note]] as most of us use every day.
- Bottom right: A "modern days" numerical tablet.
*** The code generating the figure: :noexport:
#+NAME: Making-concrete-summary-of-material aspect
#+BEGIN_SRC shell :results hide
# This requires imagemagick
cd imgs
wget https://upload.wikimedia.org/wikipedia/commons/thumb/e/e2/Clay_Tablet_-_Louvre_-_AO29562.jpg/1024px-Clay_Tablet_-_Louvre_-_AO29562.jpg -O Tablette_argile.jpg
wget https://upload.wikimedia.org/wikipedia/commons/thumb/8/85/Meister_des_Portr%C3%A4ts_des_Paquius_Proculus_001.jpg/651px-Meister_des_Portr%C3%A4ts_des_Paquius_Proculus_001.jpg -O Proculus.jpg
wget https://upload.wikimedia.org/wikipedia/commons/thumb/5/50/Commonplace_book_mid_17th_century.jpg/878px-Commonplace_book_mid_17th_century.jpg -O Carnet.jpg
wget https://upload.wikimedia.org/wikipedia/commons/6/6e/Lhfhospitalsstatehospital001.jpg -O Carte.jpg
wget https://upload.wikimedia.org/wikipedia/commons/e/ef/Fait_cnv.jpg -O Post_it.jpg
wget https://upload.wikimedia.org/wikipedia/commons/thumb/d/da/Lenovo_Yoga_3_Pro.jpg/1024px-Lenovo_Yoga_3_Pro.jpg -O Tablette_ordi.jpg
montage -mode concatenate -tile 3x2 Tablette_argile.jpg Proculus.jpg Carnet.jpg Carte.jpg Post_it.jpg Tablette_ordi.jpg Figure_W1_S2_1.jpg
rm Tablette_argile.jpg Proculus.jpg Carnet.jpg Carte.jpg Post_it.jpg Tablette_ordi.jpg
#+END_SRC
** Wax tablet and stylus
#+ATTR_LATEX: :width 1.0\textwidth
[[file:img/tabula_stilus.jpg]]
*** Details
:PROPERTIES:
:BEAMER_ENV: note
:END:
\scriptsize From the [[https://en.wikipedia.org/wiki/Wax_tablet][Wikipedia page]]:
A wax tablet is a tablet made of wood and covered with a layer of wax, often linked loosely to a cover tablet, as a "double-leaved" diptych. It was used as a reusable and portable writing surface in Antiquity and throughout the Middle Ages.
Writing on the wax surface was performed with a pointed instrument, a stylus. Writing by engraving in wax required the application of much more pressure and traction than would be necessary with ink on parchment or papyrus,[1] and the scribe had to lift the stylus in order to change the direction of the stroke. Therefore, the stylus could not be applied with the same degree of dexterity as a pen. A straight-edged, spatula-like implement (often placed on the opposite end of the stylus tip) would be used in a razor-like fashion to serve as an eraser. The entire tablet could be erased for reuse by warming it to about 50 °C and smoothing the softened wax surface. The modern expression of "a clean slate" equates to the Latin expression "tabula rasa".
** From the /scroll/ to the /codex/
#+ATTR_LATEX: :width 1.0\textwidth
[[file:img/Figure_W1_S2_3.jpg]]
*** Details
:PROPERTIES:
:BEAMER_ENV: note
:END:
\scriptsize
The shift from the /scroll/ to the /codex/ is fundamental for development of written civilization.
A scroll (from the Old French escroe or escroue), is a roll of papyrus, [[https://en.wikipedia.org/wiki/Parchment][parchment]], or paper containing writing.
From [[https://en.wikipedia.org/wiki/History_of_scrolls#Replacement_by_the_Codex][Wikipedia]]:
The codex was a new format for reading the written word, consisting of individual pages loosely attached to each other at one side and bound with boards or cloth. It came to replace the scroll thanks to several problems that limited the scroll's function and readability. For one, scrolls were very long, sometimes as long as ten meters. This made them hard to hold open and read, a difficulty not helped by the fact that most scrolls in that era were read horizontally, instead of vertically as scrolling virtual documents are read now. The text on a scroll was continuous, without page breaks, which made indexing and bookmarking impossible. Conversely, the codex was easier to hold open, separate pages made it possible to index sections and mark a page, and the protective covers kept the fragile pages intact better than scrolls generally stayed. This last made it particularly attractive for important religious texts.
The bottom left mosaic shows Virgil seating (70-19 BCE) holding a scroll of the /Aeneid/, with Clio, muse of history, also holding a scroll.
As explained by Frédéric Barbier (/Histoire du Livre/): "The scroll / volumen imposes a complex reading practice: one must unroll (/explicare/) and roll at the same time; that forbids working on several scrolls (the original text and its commentary) at the same time or to take notes. It imposes a continuous reading and making consultation impossible."
Scrolls are clearly unsuited to "nomadic reading"; can you imagine Ulysses embarking for his Odyssey carrying the 24 scrolls/volumen of the Iliad?
The term /volumen/ is the origin of our modern /volumes/ (a book in several volumes) as of the word for the geometrical concept.
Switching from scroll to codices required two innovations:
- The collection of wax tablets bound together with leather strands.
- The generalization of [[https://en.wikipedia.org/wiki/Parchment][parchment]] (usually sheep skin specially processed) as a replacement for [[https://en.wikipedia.org/wiki/Papyrus][papyrus]]. This generalization could be due (according to Pliny the Elder) to a rivalry between the cities of Pergamon and Alexandria for cultural hegemony: [[https://en.wikipedia.org/wiki/Ptolemy_V_Epiphanes][Ptolemy V Epiphanes]] King of Egypt wanted to block [[https://en.wikipedia.org/wiki/Eumenes_II][Eumenes II]] from developing in Pergamon a library that could compete with the one of Alexandria; he therefore imposed an embargo on papyrus export (Egypt was the sole papyrus producer). Eumenes looked for an alternative and fostered parchment development. The link between Pergamon and parchment is much clearer in German where Pergamon is written in the way as in English but where parchment is written /Pergament/.
Switching from scrolls to codices will have major consequences on books organization as well as on the reading practices, it will later on allow printing development.
The main revolution brought by the codex is the /page/. Thanks to this structural element, the reader can access directly to a specific chapter or a specific part of the text, while scrolls imposed continuous reading *at a time when there were no blanks between words*. According to Collette Sirat: "Twenty centuries will be necessary to realize the paramount importance of the codex for our civilization through the *selective reading* it made possible as opposed to the continuous reading. It opened room for the elaboration of mental structures where the text is dissociated from the speech and its rythm."
Notice the red letters used on the codex (bottom right), an example of [[https://en.wikipedia.org/wiki/Rubrication][rubrication]] used by scribes to mark paragraphs. With printing and the high cost of colors it entailed, an empty space started to be used to that end. Thinking about it, colors don't cost anything on a numerical support and could perfectly be used again in the same way.
** Eusebius and the invention of cross-references
#+ATTR_LATEX: :width 1.0\textwidth
[[file:img/Eusebius_final.jpg]]
*** Details
:PROPERTIES:
:BEAMER_ENV: note
:END:
\scriptsize Illustrations from Wikimedia Commons.
From the Wikipedia page on [[https://en.wikipedia.org/wiki/Eusebius][Eusebius]]:
#+BEGIN_QUOTE
Eusebius of Caesarea (ad 260/265 – 339/340), also known as Eusebius Pamphili, was a historian of Christianity, exegete, and Christian polemicist. He became the bishop of Caesarea Maritima about 314 AD. Together with Pamphilus, he was a scholar of the Biblical canon and is regarded as an extremely learned Christian of his time. He wrote Demonstrations of the Gospel, Preparations for the Gospel, and On Discrepancies between the Gospels, studies of the Biblical text.
#+END_QUOTE
According to Anthony Grafton and Megan Williams (2006) /Christianity and the Transformation of the Book/, The Belknap Press of Harvard University Press, his writings are crucial for our knowledge of the first three centuries of Christian history. /He brought several essential innovations to the book's organization like the cross-references/.
*** The code generating the figure: :noexport:
#+BEGIN_SRC sh :results silent
cd imgs
wget https://upload.wikimedia.org/wikipedia/commons/b/ba/Eusebius_of_Caesarea.jpg
wget https://upload.wikimedia.org/wikipedia/commons/1/1f/Romia_Imperio.png
convert Romia_Imperio.png Eusebius_of_Caesarea.jpg -gravity northeast -composite Eusebius.jpg
convert Eusebius.jpg -font FreeSans -pointsize 75 -gravity southwest -annotate 0 'Roman Empire' Eusebius_leg.jpg
convert Eusebius_leg.jpg -font FreeSans -pointsize 75 -annotate +700+75 'Eusebius of\nCaeserea\n(265-340)' Eusebius_leg2.jpg
convert Eusebius_leg2.jpg -font FreeSans -pointsize 30 -annotate +1150+900 'Caeserea' Eusebius_final.jpg
rm Romia_Imperio.png Eusebius_of_Caesarea.jpg Eusebius.jpg Eusebius_leg.jpg Eusebius_leg2.jpg
#+END_SRC
** Eusebian canons
#+ATTR_LATEX: :width 1.0\textwidth
[[file:img/Fol._10v-11r_Egmond_Gospels.jpg]]
#+BEGIN_EXPORT latex
\vspace{0.2cm}
#+END_EXPORT
Fol. 10v and 11r of the Egmond Gospels. Canon tables (900 CE).
*** Details
:PROPERTIES:
:BEAMER_ENV: note
:END:
\scriptsize Source: https://commons.wikimedia.org/wiki/File:Fol._10v-11r_Egmond_Gospels.jpg. Public Domain.
Quote from [[https://en.wikipedia.org/wiki/Eusebius#Biblical_text_criticism][Wikipedia]]:
#+BEGIN_QUOTE
For an easier survey of the material of the four Evangelists, Eusebius divided his edition of the New Testament into paragraphs and provided it with a synoptical table so that it might be easier to find the pericopes that belong together. These canon tables or "Eusebian canons" remained in use throughout the Middle Ages, and illuminated manuscript versions are important for the study of early medieval art, as they are the most elaborately decorated pages of many Gospel books.
#+END_QUOTE
*** The code generating the figure: :noexport:
#+BEGIN_SRC sh :results silent
cd imgs
wget https://upload.wikimedia.org/wikipedia/commons/0/0e/Fol._10v-11r_Egmond_Gospels.jpg
#+END_SRC
** The significance of the /codex/
Following Frédéric Barbier (/HISTOIRE DU LIVRE/, Armand Colin, 2009):
- The invention of the /codex/ is crucial for the development of written civilization.
- The /codex/ lends itself to *consultation reading*.
- We can add to the /codex/ a "navigation system" making consultation easier.
- We can take notes while consulting a /codex/.
- The combination of the /codex/ with the /Carolingian minuscule/ constitutes an extremely powerful intellectual tools, never seen before.
*** Details
:PROPERTIES:
:BEAMER_ENV: note
:END:
\scriptsize
Example of /Carolingian minuscule/ can be found on the corresponding [[https://en.wikipedia.org/wiki/Carolingian_minuscule][Wikipedia page]].
Over centuries, /codices/---that we often call /manuscripts/---will slowly evolve and gain modern days book attributes:
- separation between words (VIIth century),
- start of punctuation (VIIIth century),
- table of content,
- running title,
- paragraph marks (rubrication, XIth century),
- pagination,
- index (XIIIth century).
An interesting point: Torah's content got "fixed" before the /codex/ generalization and today Torah scrolls are still used.
** Let us not forget China
#+ATTR_LATEX: :width 1.0\textwidth
[[file:img/Figure_W1_S2_6.jpg]]
*** Details
:PROPERTIES:
:BEAMER_ENV: note
:END:
\scriptsize
The link between the /codex/ generalization, on the one hand, and the apparition of "navigation guides" like the table of content, the index, the running title, on the other hand as a counterpart in the Chinese civilization.
In China, competitive examinations to become a high ranking state employee developed in the IXth century (CE). The main part of these exam was a paper on what we would now call general knowledge of the Classics where the students were asked to demonstrate their knowledge through appropriate quotations.
To fulfill the need of "textbook" appropriate for this kind of examination what is called [[https://en.wikipedia.org/wiki/Leishu][leishus]] were produced. They are described as follows on Wikipedia:
#+BEGIN_QUOTE
The leishu are composed of sometimes lengthy citations from other works and often contain copies of entire works, not just excerpts. The works are classified by a systematic set of categories, which are further divided into subcategories. Leishu may be considered anthologies, but are encyclopedic in the sense that they may comprise the entire realm of knowledge at the time of compilation.
#+END_QUOTE
The efficient use of the leishu requires an indexing system, a table of content, etc. Very interestingly, the scroll will be abandoned and the codex will generalize in China around that time, as observed by Ann Blair in her book /TOO MUCH TO KNOW/, Yale Univ. Press, 2010 (pp. 28-31).
Most of the leishus *were printed* (from the IXth century on!). The picture on the right side (a banknote printing plate) is there to remind us of who was (by far) the most advanced at that time. The Chinese were of course printing their leishus on paper that they discovered in the VIIIth century BCE.
*** The code generating the figure: :noexport:
#+BEGIN_SRC sh :results silent
cd imgs
wget https://upload.wikimedia.org/wikipedia/commons/e/e5/Yongle_Dadian_Encyclopedia_1403.jpg
wget https://upload.wikimedia.org/wikipedia/commons/thumb/a/aa/Beijing.China_printing_museum.Plate_of_Paper_money.Northern_Song_Dynasty.jpg/615px-Beijing.China_printing_museum.Plate_of_Paper_money.Northern_Song_Dynasty.jpg -O Matrice_billet_song.jpg
convert Yongle_Dadian_Encyclopedia_1403.jpg Matrice_billet_song.jpg +append -font FreeSans -pointsize 30 -gravity southwest -annotate +25-150 "Top: Yongle Dadian (1403) contains\n370 millions Chinese characters.\n\nRight: Banknote printing plate from\nNorthern Song Dynasty (960 – 1279)." Figure_W1_S2_6.jpg
rm Yongle_Dadian_Encyclopedia_1403.jpg Matrice_billet_song.jpg
#+END_SRC
** Getting organized by using the right slot
#+ATTR_LATEX: :width 1.0\textwidth
[[file:img/Placcius_cabinet_TabIV.png]]
#+BEGIN_EXPORT latex
\vspace{0.25cm}
#+END_EXPORT
Placcius' closet again (Placcius, Vincent, 1642-1699. /De arte excerpendi vom gelahrten Buchhalten/, 1689. Houghton Library, Harvard University.)
*** Details
:PROPERTIES:
:BEAMER_ENV: note
:END:
\scriptsize
Now that we briefly reviewed the timeline of the main navigation elements of the books---navigation elements that can of course be applied to our lab/note-books---we come back to the paper slips and cards as notes media.
We see (again) Placcius' and Leibniz's closet since it displays both the benefits and the shortcomings of media that hold *a single note*.
Obvious shortcomings are:
- Paper slips and cards get easily lost.
- They are essentially useless if they are not *classified* in addition to being filed.
These problems are solved by Placcius' cabinet, the content of which is fundamentally accessed through the index.
Clear benefits are:
- Paper slips can be easily reorganized when they contain information on several subjects.
- Paper slips can be directly pasted in a book when composing an anthology or a compendium.
This last technique (pasting when making an anthology) was systematically used by the Renaissance polymath [[https://en.wikipedia.org/wiki/Conrad_Gessner][Conrad Gessner]] (1516-1565) who even got his paper slips by cutting parts of pages from books (don't do that with library books)!
** Constructing a notebook index the John Locke way
#+ATTR_LATEX: :width 1.0\textwidth
[[file:img/MethodeLocke1.jpg]]
#+BEGIN_EXPORT latex
\vspace{0.25cm}
#+END_EXPORT
My own notebook is used here for illustration.
*** Details
:PROPERTIES:
:BEAMER_ENV: note
:END:
\scriptsize
We will now learn about an index construction technique due to [[https://en.wikipedia.org/wiki/John_Locke][John Locke]] (1632-1704), the grand-father of liberalism and a major investor in the /Royal African Company/, the largest company in the [[https://en.wikipedia.org/wiki/John_Locke#Constitution_of_Carolina][slave-trade]] business at that time...
The indexing method is here illustrated using my own notebook. The two pages that are displayed describe the structure of a dataset in the [[https://www.hdfgroup.org/][HDF5]] format on the left side and the corresponding structure (designed to map the former one) of a =data frame= object of the [[https://www.r-project.org/][R]] language. This dataset contain *calcium* concentration measurements made in *neurons*. This notes were taken while writing some computer *code* to analyze the data.
The precise content of the pages does not matter here in order to understand how Locke's method works. The important points are:
- The pages are numbered (we are seeing here pages 86 and 87).
- Keywords are written at the bottom of the page: *code*; *neuro*; *calcium*.
This method can be applied after note-taking, you just need to have few pages left at the end of your notebook. That's in fact what I did since I had started filling my notebook before learning about the method (I learned about while preparing the French version of this lecture last September).
** Locke's method continued
#+ATTR_LATEX: :width 0.8\textwidth
[[file:img/MethodeLocke2.jpg]]
#+BEGIN_EXPORT latex
\vspace{0.25cm}
#+END_EXPORT
The last pages of my notebook with the index.
*** Details
:PROPERTIES:
:BEAMER_ENV: note
:END:
\scriptsize
We know the index. It is located at the end of the notebook although Locke recommends placing it at the beginning. Since I did not know about the method when I started the notebook, I had to place it at the end...
The idea is to enter the keywords used in the notebook based on their *first letter* and the *first vowel following the first letter*.
The index is therefore made of the 26 letters (you see letters "A" to "R" here, the remaining ones are on the next page) subdivided the five most common vowels ("y" goes together with "i" in that case).
Pages 86 and 87 contained the keyword *code* that goes into the entry "Co" of the index (you see "86-89" because the following pages also concern code for the same project). The keyword *Neuro* giving an entry on line "Ne", while the keyword *Calcium* gives an entry on line "Ca".
The keyword *Criquet* (not shown above) gives an entry on line "Ci".
It is also a good idea to list the set of keywords used in the notebook on the page preceding or following the index.
** Conclusions of the historical overview
Since it is hard (for me at least) to use paper as a medium for note-taking, learning from "Newton's giants" should save us from reinventing the wheel (and getting it square).
#+BEGIN_EXPORT latex
\vspace{0.25cm}
#+END_EXPORT
We should nevertheless use digital media as much as possible (while keeping in mind what we just learned) since they provide:
- more organizational and structural flexibility,
- reliable archiving tools,
- powerful indexing tools.
* M1-S3: From text files to lightweight markup languages
** Section introduction
:PROPERTIES:
:BEAMER_ENV: note
:END:
We now start the "technical" part of this lecture with the tools that computers provide for note-taking like [[https://en.wikipedia.org/wiki/Text_file][text files]] and [[https://en.wikipedia.org/wiki/Lightweight_markup_language][lightweight markup languages]].
** What is a /text file/ or /text format/?
- From a practical point of view, a [[https://en.wikipedia.org/wiki/Text_file][text files]] /gives something readable/ when opened with a [[https://en.wikipedia.org/wiki/Text_editor][text editor]].
- A [[https://en.wikipedia.org/wiki/Text_editor][text editor]] enables us to create and modify text files (nice circular definition!). It's a software like:
+ [[https://notepad-plus-plus.org/][Notepad++]] for =Windows=,
+ [[https://wiki.gnome.org/Apps/Gedit][gedit]] for =Unix/Linux= systems (but it also runs on the other two),
+ [[https://en.wikipedia.org/wiki/TextEdit][TextEdit]] for =MacOS=.
#+BEGIN_EXPORT latex
\vspace{0.2cm}
#+END_EXPORT
- I'm mentioning only open source software since it is hard to do genuinely reproducible research with anything else.
- A [[https://en.wikipedia.org/wiki/Word_processor][word precessor]] is more sophisticated than a /text editor/.
- *Warning* the native format used by word processors is rarely a /text format/. =Word='s =doc= and =docx= files and =Libreoffice= =odt= files /are not text files/.
** Example of a file that cannot be read with a text editor
#+ATTR_LATEX: :width 0.9\textwidth
[[file:img/pdf_opened_with_gedit.png]]
#+BEGIN_EXPORT latex
\vspace{0.25cm}
#+END_EXPORT
A =pdf= file (the file shown right now with a pdf reader) opened with =gedit=.
** A text file opened with a text editor
#+ATTR_LATEX: :width 0.9\textwidth
[[file:img/source_file_opened_with_gedit.png]]
#+BEGIN_EXPORT latex
\vspace{0.25cm}
#+END_EXPORT
A =markdown= file (a source file for this lecture) opened with =gedit=.
** Why should we use text files?
Characters contained in text files are now typically encoded in [[https://en.wikipedia.org/wiki/UTF-8][UTF-8]].
#+BEGIN_EXPORT latex
\vspace{0.2cm}
#+END_EXPORT
*This implies that*:
#+BEGIN_EXPORT latex
\vspace{0.2cm}
#+END_EXPORT
- It is "always" possible to read these files with a text editor /even years after their creation/.
- [[https://en.wikipedia.org/wiki/Desktop_search][Desktop search]] and [[https://en.wikipedia.org/wiki/Version_control][version control]] software work /very efficiently/ with them.
#+BEGIN_EXPORT latex
\vspace{0.2cm}
#+END_EXPORT
*Unless you run into serious memory problems, use text files, always.*
** Problems with simple text files
- The "simple" text file precludes the use of nice navigation tools like [[https://en.wikipedia.org/wiki/Hyperlink][hyperlinks]].
- It is not possible to emphasize a word with a *bold* or an /italic/ font.
- If several persons work on the same text, they can't correct each other by \sout{striking through} text.
#+BEGIN_EXPORT latex
\vspace{0.2cm}
#+END_EXPORT
These limitations, combined with the benefits of text files, led computer scientists to develop [[https://en.wikipedia.org/wiki/Markup_language][markup languages]].
** A trivial example is the HTML language.
#+ATTR_LATEX: :width 0.9\textwidth
[[file:img/HTML_viewed_with_qutebrowser.png]]
#+BEGIN_EXPORT latex
\vspace{0.25cm}
#+END_EXPORT
Wikipedia [[https://en.wikipedia.org/wiki/HTML][HTML]] page viewed with [[http://www.qutebrowser.org/][qutebrowser]] [[https://en.wikipedia.org/wiki/Web_browser][web browser]].
** An HTML file opened with a text editor
#+ATTR_LATEX: :width 0.9\textwidth
[[file:img/HTML_opened_with_gedit.png]]
#+BEGIN_EXPORT latex
\vspace{0.25cm}
#+END_EXPORT
The Wikipedia HTML page opened with =gedit=. Markup languages were not designed to be read by humans.
*** Note
:PROPERTIES:
:BEAMER_ENV: note
:END:
The content of files written with a markup language are typically processed by a dedicated software like a web browser or converted into a format for which readers are available like \LaTeX{} files that get "compiled" into PDF files.
If you look carfuly the last figure, you can find the text of the first main paragraph of the previous figure.
**
We can summarize our problem as follows:
#+BEGIN_EXPORT latex
\vspace{0.2cm}
#+END_EXPORT
- Text files are attractive for note-taking.
- Markup languages provide a much better "reading experience" when viewed with the proper "browser".
- Markup language files are text files, *but* usually require dedicated editing software if we want to modify them.
#+BEGIN_EXPORT latex
\vspace{0.2cm}
#+END_EXPORT
Is it possible to combine the benefits of "simple" text files with the reading comfort of markup languages?
** Lightweight markup languages: the idea
A [[https://en.wikipedia.org/wiki/Lightweight_markup_language][lightweight markup language]] is:
#+BEGIN_EXPORT latex
\vspace{0.2cm}
#+END_EXPORT
- A /markup language/ with a *simple syntax*.
- A language designed to be *easily edited* with a /text editor/.
- A language *easily read* without a browser.
** =Markdown= as an example
#+ATTR_LATEX: :width 1.0\textwidth
[[file:img/Markdown_syntax.png]]
#+BEGIN_EXPORT latex
\vspace{0.25cm}
#+END_EXPORT
The syntax basics from [[https://en.wikipedia.org/wiki/Markdown][Wikipedia]], see also "Mastering Markdown" (a 3 min read) from [[https://guides.github.com/features/mastering-markdown/][GitHub]].
** =Markdown= is not the only lightweight markup language
Among the "most popular":
#+BEGIN_EXPORT latex
\vspace{0.2cm}
#+END_EXPORT
- [[https://en.wikipedia.org/wiki/MediaWiki#Markup][MediaWiki]] used by Wikipedia (but files are not stored in text format!).
- [[https://www.dokuwiki.org/dokuwiki#][DokuWiki]] like =MediaWiki= but stored in text format.
- [[http://docutils.sourceforge.net/rst.html][reStructuredText]] used for the [[https://www.python.org/][python]] documentation.
- [[http://www.methods.co.nz/asciidoc/][AsciiDoc]].
- [[https://orgmode.org/][Org mode]], my favorite, but it requires learning [[https://www.gnu.org/software/emacs/][emacs]] (a good thing to do, if you have time for it).
#+BEGIN_EXPORT latex
\vspace{0.2cm}
#+END_EXPORT
The good news is that you don't need to be too nervous about choosing the "right" language, thanks to [[https://pandoc.org/][pandoc]] you can convert one into any other!
** Summary of this section
Thanks to lightweight markup languages we will be able to:
#+BEGIN_EXPORT latex
\vspace{0.2cm}
#+END_EXPORT
- Work mostly with text files.
- Write our notes quickly with any editor.
- Organize our notes.
* M1-S4: Notes (and codes) that are archived but can evolve with version control systems
** Introduction of this section
- The tools we are going to discuss should appeal to a much wider audience than the reproducible research community.
- Anyone working with text is concerned, even more so when this work is done in collaboration.
- *The longevity issue of notes and texts is in no way new*.
- The humanists and scholars of the early modern period who specialized in text compilations were literally obsessed by this problem and used it to justify their work.
- Their solution was to use multiple copies, as we now do with a different medium.
- We should nevertheless remain humble, the paper (and parchment) medium used by humanists has demonstrated its capability to last.
- When it comes to making notes evolve, I think we can say that some real progress was recently made.
** The nightmare: changing a text on paper medium
***
:PROPERTIES:
:BEAMER_COL: 0.48
:BEAMER_ENV: block
:END:
#+ATTR_LATEX: :width 1.0\textwidth
[[file:img/Pierre_Ambroise_Choderlos_de_Laclos_Les_Liaisons_dangereuses.png]]
***
:PROPERTIES:
:BEAMER_COL: 0.48
:BEAMER_ENV: block
:END:
Manuscript of /Dangerous Liaisons/ (/Les liaisons dangereuses/) by Pierre Choderlos de Laclos (p. 258, BNF Gallica).
There is clearly a very limited number of changes one can bring in that way!
** Changing a text with a word processor
#+ATTR_LATEX: :width 1.0\textwidth
[[file:img/LibreOffice_notes_pour_CLOM_diff_origine.png]]
#+BEGIN_EXPORT latex
\vspace{0.25cm}
#+END_EXPORT
An early version of this lecture (in French) edited with =LibreOffice=.
*** Details
:PROPERTIES:
:BEAMER_ENV: note
:END:
We see a way of working in collaboration on a text: most word processing software have a way to follow changes brought to the text.
This is not the solution I recommend but this is probably the most widely known concurrent version facility.
Notice the buttons at the bottom left. They appear when you navigate in /view/ -> /Toolbars/ -> /track changes/.
This "solution":
- is easy to implement,
- /does not generate text files/
- does not take care of archiving the files.
** Making change with a "wiki engine"
#+ATTR_LATEX: :width 1.0\textwidth
[[file:img/Dokuwiki_notes_pour_CLOM.png]]
#+BEGIN_EXPORT latex
\vspace{0.25cm}
#+END_EXPORT
The personal wiki (using the [[https://www.dokuwiki.org/dokuwiki#][dokuwiki]] engine) I experienced while preparing the French version of this lecture.
*** Details
:PROPERTIES:
:BEAMER_ENV: note
:END:
I started using [[https://www.dokuwiki.org/dokuwiki#][dokuwiki]] for this lecture, it is therefore simple enough to learn.
=Dokuwiki= uses a test format.
**
#+ATTR_LATEX: :width 1.0\textwidth
[[file:img/Dokuwiki_notes_pour_CLOM_historique2.png]]
#+BEGIN_EXPORT latex
\vspace{0.25cm}
#+END_EXPORT
Clicking /previous versions/ (/anciennes révisions/) gives access to the list of changes done when and by whom. If I now select two versions...
**
#+ATTR_LATEX: :width 1.0\textwidth
[[file:img/Dokuwiki_notes_pour_CLOM_diff.png]]
#+BEGIN_EXPORT latex
\vspace{0.25cm}
#+END_EXPORT
I see the differences between the two versions. You obtain the same thing on Wikipedia by clicking on /View History/.
** Pros and cons
- A solution with a strong record for collaborative projects (Wikipedia).
- A text format is used when working with =Dokuwiki=.
#+BEGIN_EXPORT latex
\vspace{0.25cm}
#+END_EXPORT
- A single page can be modified at a time.
** Version Control Systems
I now come to the most "sophisticated" solution:
- A dedicated software, [[https://git-scm.com/][git]], is used to manage the successive versions of a *set* of files in *different formats* (text, images, etc.). In fact, file arborizations can be managed.
- =git=-like software requires a repository, that can be built on the user's computer, but is usually on a dedicated server like [[https://github.com/][GitHub]] or [[https://gitlab.com/][GitLab]].
- The repository allows several people to work on the same project and to exchange their modifications. Each project member has a *full copy* of the repository (dating back to his/her last /synchronization/).
**
#+ATTR_LATEX: :width 1.0\textwidth
[[file:img/GitLab_Commits.png]]
#+BEGIN_EXPORT latex
\vspace{0.25cm}
#+END_EXPORT
The [[https://gitlab.com/][GitLab]] interface containing the files of this presentation.
**
#+ATTR_LATEX: :width 1.0\textwidth
[[file:img/GitLab_Diff.png]]
#+BEGIN_EXPORT latex
\vspace{0.25cm}
#+END_EXPORT
Modifications are easily visualized...
**
#+ATTR_LATEX: :width 1.0\textwidth
[[file:img/GitLab_Formating.png]]
#+BEGIN_EXPORT latex
\vspace{0.25cm}
#+END_EXPORT
Text files entered with a lightweight markup language get automatically formatted (an example with =org=).
** Pros and cons
- A "sophisticated" approach that takes a bit more time to learn and master than the other two.
#+BEGIN_EXPORT latex
\vspace{0.25cm}
#+END_EXPORT
- A strong record for collaborative projects (Linux kernel,...).
- Can manage modifications on several files at once.
- A centralized version *copied* by each member of the project.
* M1-S5: Finding one's way with tags and desktop search application
** Leibniz again
"It seems to me that the apparatus of contemporary scholarship is comparable to a very large store which, though it keeps a great variety of goods, yet is totally confused and in disorder, because all items are mixed up, because no numbers or letters of an index are displayed, and because inventories or account ledgers which could throw some light on the matter are missing."
"The larger the mass of collected things, the less will be their usefulness. Therefore, one should not only strive to assemble new goods from everywhere, but one must endeavor to put in the right order those that one already possesses."
** Finding one's way in a text file
#+ATTR_LATEX: :width 1.0\textwidth
[[file:img/recherche-avec-editeur.png]]
** Finding one's way in a notebook
#+ATTR_LATEX: :width 1.0\textwidth
[[file:img/IndexCahierLocke.jpg]]
** Finding one's way in a cards collection
#+ATTR_LATEX: :width 1.0\textwidth
[[file:img/Placcius_cabinet_TabIV.png]]
** Problems, limitations, solutions?
- A single document at a time
- Numerical files indexation
- Tagging numerical files in general (not only text format files)
- Using a desktop search application for indexation and general search
** Finding an arbitrary word with a desktop search application (=DocFetcher=)
#+ATTR_LATEX: :width 1.0\textwidth
[[file:img/Trouver_un_mot_avec_DocFetcher.png]]
** A problem: overabundance
#+ATTR_LATEX: :width 1.0\textwidth
[[file:img/Trouver_calcium_avec_DocFetcher.png]]
** Adding tags / keywords in a text file (=Markdown=)
#+ATTR_LATEX: :width 1.0\textwidth
[[file:img/Ajout_etiquette_avec_Markdown.png]]
** Finding a tag with a desktop search application (=DocFetcher=)
#+ATTR_LATEX: :width 1.0\textwidth
[[file:img/Trouver_etiquette_avec_DocFetcher.png]]
** Image files contain metadata
#+ATTR_LATEX: :width 1.0\textwidth
[[file:img/Metadonne_fichier_index.jpg]]
** Metadata can be set
#+ATTR_LATEX: :width 1.0\textwidth
[[file:img/Metadonne_fichier_index2.jpg]]
** Desktop search applications can read metadata
#+ATTR_LATEX: :width 1.0\textwidth
[[file:img/Trouver_etiquette_avec_DocFetcher2.jpg]]
** Conclusions
Using:
\vspace{0.25cm}
- tags / keywords inserted in our numerical files (text, images, =PDF=, etc.)
- a desktop search application
\vspace{0.25cm}
we can (perhaps) avoid "Leibniz's nightmare".
**Disclaimer:** The two sections *A simple "reproducible research" emacs
configuration* and *A stub of replicable article* explain how to set up
emacs/org-mode for this MOOC. These are very important sections in the
context of this MOOC. **These sections are illustrated in two out of the
[three video tutorials of this
sequence](https://www.fun-mooc.fr/courses/course-v1:inria+41016+session01bis/jump_to_id/9cfc7500f0ef46d288d2317ec7b037b4),
and** **which you really should follow carefully**. **Otherwise, you may
have trouble doing the exercises later on**. Likewise, I strongly
encourage you to watch the ["emacs and git" video tutorial available at
the same
place](https://www.fun-mooc.fr/courses/course-v1:inria+41016+session01bis/jump_to_id/9cfc7500f0ef46d288d2317ec7b037b4).
The next section provides information on how to install emacs.
Table of Contents
=================
- [Installing emacs, org-mode, ess, and
auctex.](#installing-emacs-org-mode-ess-and-auctex)
- [Linux (Debian, Ubuntu)](#linux-debian-ubuntu)
- [macOS](#macos)
- [Windows](#windows)
- [All platforms: pretty code in HTML
export](#all-platforms-pretty-code-in-html-export)
- [A simple "*reproducible research*" emacs configuration
](#a-simple-reproducible-research-emacs-configuration-)
- [Step 0: Backup and download our
configuration](#step-0-backup-and-download-our-configuration)
- [Step 1: Prepare your journal](#step-1-prepare-your-journal)
- [Step 2: Set up Emacs
configuration](#step-2-set-up-emacs-configuration)
- [Step 3: Adapt the configuration to your specific needs if
required](#step-3-adapt-the-configuration-to-your-specific-needs-if-required)
- [Step 4: Check whether the installation is working or
not](#step-4-check-whether-the-installation-is-working-or-not)
- [Step 5: Open and play with your
journal:](#step-5-open-and-play-with-your-journal)
- [A stub of a replicable article](#a-stub-of-a-replicable-article)
- [Emacs tips and tricks](#emacs-tips-and-tricks)
- [Cheat-sheets](#cheat-sheets)
- [Video tutorials](#video-tutorials)
- [Additional useful emacs
packages](#additional-useful-emacs-packages)
- [Other resources](#other-resources)
Installing emacs, org-mode, ess, and auctex.
============================================
Linux (Debian, Ubuntu)
----------------------
We provide here only instructions for Debian-based distributions. Feel
free to contribute to this document to provide up-to-date information
for other distributions (e.g.n redhat, fedora).
Today, the stable versions of the most common distributions provide
recent enough versions of emacs and org-mode:
- Debian (stretch) ships with [emacs
25.1](https://packages.debian.org/stretch/emacs25) and [org-mode
9.0.3](https://packages.debian.org/stretch/org-mode)
- Ubuntu (bionic 18.04) ships with [emacs
25.2](https://packages.ubuntu.com/bionic/emacs25) and [org-mode
9.1.6](https://packages.ubuntu.com/bionic/org-mode)
- Ubuntu (artful 17.04) ships with [emacs
25.2](https://packages.ubuntu.com/artful/emacs25) and [org-mode
9.0.9](https://packages.ubuntu.com/artful/org-mode)
If your distribution is older than this, well, it may be a good time for
upgrading...
Simply run (as root):
``` {.bash .rundoc-block rundoc-language="sh" rundoc-results="output" rundoc-exports="both"}
apt-get update ; apt-get install emacs25 org-mode ess r-base auctex
```
Then make sure you have a sufficiently recent version of emacs.
``` {.bash .rundoc-block rundoc-language="sh" rundoc-results="output" rundoc-exports="both"}
emacs --version 2>&1 | head -n 1
```
``` {.example}
GNU Emacs 25.2.2
```
Likewise, you'll want to check you have a recent version of org-mode:
``` {.bash .rundoc-block rundoc-language="sh" rundoc-results="output" rundoc-exports="both"}
emacs -batch --funcall "org-version" 2>&1 | grep version
```
``` {.example}
Org mode version 9.1.11 (9.1.11-dist @ /usr/share/emacs/25.2/site-lisp/elpa/org-9.1.11/)
```
The version numbers you get will depend on the distribution you are
running. **You really want to make sure you do not rely on org-mode 8**,
which is now deprecated.
macOS
-----
**Note:** macOS comes with a prehistoric command-line-only version of
Emacs located at `/usr/bin/emacs`. It's best to forget about it.
- **Option 1**: Install the `.dmg` file from [Vincent
Goulet](http://vgoulet.act.ulaval.ca/):
[<https://vigou3.gitlab.io/emacs-modified-macos/>](https://vigou3.gitlab.io/emacs-modified-macos/).
It ships with recent versions:
- Emacs 26.1
- Org-mode 9.1.13
- ESS 17.11
If you install this version of Emacs, or in fact any other version
of Emacs distributed as a clickable application in a `.dmg` file,
you must type the full path to the executable if you want to run
Emacs from a terminal. For example, if your clickable application is
at `/Applications/Emacs.app`, then the executable is at
`/Applications/Emacs.app/Contents/MacOS/Emacs`
- **Option 2**: If you use [Homebrew](https://docs.brew.sh/), do the
following:
``` {.bash .rundoc-block rundoc-language="sh" rundoc-results="output" rundoc-exports="both"}
brew update
brew install emacs --with-cocoa
brew linkapps emacs
brew install wget
brew tap dunn/emacs
brew install auctex
brew tap brewsci/science
brew install ess
```
This provides an `emacs` command for use from the command line, plus
a clickable application at `Cellar/emacs/26.1_1/Emacs.app` inside
your Homebrew directory. If you installed Homebrew at the default
location `/usr/local`, then this is
`/usr/local/Cellar/emacs/26.1_1/Emacs.app`. If you installed
Homebrew on an account with administrator privileges, you can add
``` {.bash .rundoc-block rundoc-language="sh" rundoc-results="output" rundoc-exports="both"}
brew linkapps emacs
```
in order to make Emacs accessible directly from `/Applications`.
Windows
-------
Install the `.exe` file from [Vincent
Goulet](http://vgoulet.act.ulaval.ca/):
[<https://vigou3.gitlab.io/emacs-modified-windows/>](https://vigou3.gitlab.io/emacs-modified-windows/).
It ships with recent versions:
- Emacs 26.1
- Org-mode 9.1.13
- ESS 17.11
### Directory naming conventions
In the following instructions, we refer to your home directory through
the (UNIX) `~/` notation. On Windows, your home directory should be
something like `C:\Users\yourname`. Therefore, whenever we mention the
`~/org/` (resp. the `~/.emacs.d/`) directory this means we are referring
to `C:\Users\yourname\org` (resp. `C:\Users\yourname\.emacs.d\`).
### Making R and Python available to the console
When running a command, Windows will look for the command in the
directories indicated in the `PATH` environment variable. If none of
these directories contains the command, Windows will stop and indicate
the command does not exist. To make sure R (which may be in something
like `C:/Program Files/R/R-3.5.1/bin/x64/`) and Python (which may be in
something like `C:/Program Files/Python/Python37/`) can easily be run
from Emacs, you should thus configure the `PATH` variable accordingly.
This requires to go through the "Environment Variable" editor as
explained
[here](http://sametmax.com/ajouter-un-chemin-a-la-variable-denvironnement-path-sous-windows/).
### Installing and configuring Matplotlib (graphic python library)
Open an DOS console and type the following command:
``` {.shell .rundoc-block rundoc-language="shell" rundoc-results="output" rundoc-exports="both"}
python -m pip install -U matplotlib
```
![](emacs_orgmode_images/install_matplotlib.png)
Then you will want to deactivate interactive plots in matplotlib. To
this end, you first need to know where the matplotlib configuration is
located. Open a python console the type the following code:
``` {.python .rundoc-block rundoc-language="python" rundoc-results="output" rundoc-exports="both"}
import matplotlib
matplotlib.matplotlib_fname()
```
![](emacs_orgmode_images/matplotlib.png)
Open the `matplotlibrc` file and modify the line starting with `backend`
to make it `backend : Agg`.
All platforms: pretty code in HTML export
-----------------------------------------
To have code pretty printing when exporting to HTML, you should install
the `htmlize` package, which is done by opening emacs and typing the
following command:
``` {.example}
M-x package-install RET htmlize RET # where M-x means pressing the "Esc" key then the "x" key
```
A simple "*reproducible research*" emacs configuration
======================================================
This section is illustrated in a [video
tutorial](https://www.fun-mooc.fr/courses/course-v1:inria+41016+session01bis/jump_to_id/9cfc7500f0ef46d288d2317ec7b037b4)
(/"Mise en place Emacs/Orgmode"/ in French). Watching it before
following the instructions given in this section may help.
Emacs comes with very basic default configuration and it appears like
everyone has its own taste. You will for example find
[here](https://www.emacswiki.org/emacs/StarterKits) several default
Emacs configurations that reflect the preferences of their creators.
Likewise the configuration of Org-Mode is incredibly flexible (see for
example [the org-mode
website](https://orgmode.org/worg/org-configs/index.html) for more
references). In the context of this MOOC, we propose you a relatively
minimalist one that is rather "*reproducible research*" oriented by
adding a few org-mode specific configurations.
Step 0: Backup and download our configuration
---------------------------------------------
The procedure we propose will wipe your already existing custom Emacs
configuration if you have one. **You should thus beforehand make a
backup** of `~/.emacs` and of `~/.emacs.d/init.el` (if these files
exist).
Then download [this
archive](https://app-learninglab.inria.fr/gitlab/learning-lab/mooc-rr-ressources/raw/master/module2/ressources/rr_org_archive.tgz)
and uncompress it. It contains the following files and we will refer to
them in the following:
``` {.example}
rr_org/init.el
rr_org/journal.org
```
Alternatively, [the files you are looking for are available
here](rr_org/).
Step 1: Prepare your journal
----------------------------
Create an `org/` directory in the top of your home:
``` {.bash .rundoc-block rundoc-language="sh" rundoc-results="output" rundoc-exports="both"}
mkdir -p ~/org/
```
Then copy `rr_org/journal.org` file in your `~/org/` directory. This
file will be your laboratory notebook and all the notes you will capture
with `C-c c` will go automatically go in this file. The first entry of
this notebook is populated with [many Emacs
shortcuts](https://app-learninglab.inria.fr/gitlab/learning-lab/mooc-rr-ressources/blob/master/module2/ressources/rr_org/journal.org)
that you should give a try.
Step 2: Set up Emacs configuration
----------------------------------
Copy `rr_org/init.el` in your `~/.emacs.d/` directory.
Alternatively, if you do not want to mess with your already existing
emacs configuration, you may launch emacs with this specific
configuration with the following command: `emacs -q -l rr_org/init.el`.
Step 3: Adapt the configuration to your specific needs if required
------------------------------------------------------------------
There are two situations in which it might be necessary to modify
`init.el`:
1. Your network environment forces you to use a proxy for access to Web
sites (HTTP(S) protocol).
2. You have multiple installations of Python or R on your computer, or
they are in unusual places and not fully configured. If you can run
- "python3" and "R" under Linux and macOS
- "Python" and "R" under Windows
in a terminal without getting an error message, then you should not
have to do anything.
If you do have to modify `init.el`, check the comments at the beginning
of the file for instructions.
Step 4: Check whether the installation is working or not
--------------------------------------------------------
Open a new instance of Emacs and open a `foo.org` file. Copy the
following lines in this file:
``` {.example}
#+begin_src shell :session foo :results output :exports both
ls -la # or dir under windows
#+end_src
```
Put your cursor inside this code block and execute it with the following
command: `C-c C-c` (If you are not familiar with Emacs commands, this
one means '`Ctrl + C`' twice)
A `#+RESULTS:` block with the result of the command should appear if it
worked.
In the video, we already have demonstrated the main features and
shortcuts of emacs/org-mode that will help you maintain a document and
benefit from literate programming. The list of features and shortcuts is
demonstrated in the [first entry of your
labbook](https://app-learninglab.inria.fr/gitlab/learning-lab/mooc-rr-ressources/blob/master/module2/ressources/rr_org/journal.org).
Step 5: Open and play with your journal:
----------------------------------------
In step 1, you were told to create an journal in `~org/journal.org`.
First you probably want to make sure this file is stored in a version
control system like git. We leave it up to you to set this up but if you
have any trouble, feel free to ask on the FUN forums.
A stub of a replicable article
==============================
This section is illustrated in a [video
tutorial](https://www.fun-mooc.fr/courses/course-v1:inria+41016+session01bis/jump_to_id/9cfc7500f0ef46d288d2317ec7b037b4)
(/"Écrire un article réplicable avec Emacs/Orgmode"/ in French).
Watching it before following the instructions given in this section may
help.
Remember, you need a working LaTeX and R environment. If you can't open
a terminal and run the commands `R`, `pdflatex`, and `python`, you will
not be able to generate this document. When being compiled, the article
downloads the corresponding LaTeX packages so you also need to have a
working `wget` command (alternatively, it uses `curl`). Once downloaded,
you may still read the source
([article.org](https://app-learninglab.inria.fr/gitlab/learning-lab/mooc-rr-ressources/blob/master/module2/ressources/replicable_article/article.org))
and understand how it works though.
Download the following
[archive](https://app-learninglab.inria.fr/gitlab/learning-lab/mooc-rr-ressources/raw/master/module2/ressources/replicable_article.tgz),
uncompress it and simply `make` to generate the article. You should then
be able to open the [resulting
article](https://app-learninglab.inria.fr/gitlab/learning-lab/mooc-rr-ressources/blob/master/module2/ressources/replicable_article/article.pdf).
This is summarized in the following command:
``` {.bash .rundoc-block rundoc-language="sh" rundoc-results="output" rundoc-exports="both"}
wget --no-check-certificate -O replicable_article.tgz https://app-learninglab.inria.fr/gitlab/learning-lab/mooc-rr-ressources/raw/master/module2/ressources/replicable_article.tgz
tar zxf replicable_article.tgz; cd replicable_article; make ; evince article.pdf
```
**Possible issues**:
- If the `make` command fails (especially on Mac), it may be because
Emacs or something else is not correctly installed. In that case,
open the article directly with the following command:
``` {.bash .rundoc-block rundoc-language="sh" rundoc-results="output" rundoc-exports="both"}
emacs -q --eval "(setq enable-local-eval t)" --eval "(setq enable-local-variables t)" article.org
```
and export it to pdf with the following shortcut: `C-c C-e l o`
- If it still doesn't work and emacs complains about not finding ESS,
it may be because you installed ESS in your home instead of
system-wide. In that case, try to remove the `-q` in the previous
command line to load your personal emacs configuration.
Finally, when you'll be tired of always re-executing all the source code
when exporting, just look for the following line in
[article.org](https://app-learninglab.inria.fr/gitlab/learning-lab/mooc-rr-ressources/blob/master/module2/ressources/replicable_article/article.org):
``` {.example}
# #+PROPERTY: header-args :eval never-export
```
If you remove the `` in the beginning of the line, it will not be a
comment anymore and will indicate org-mode to stop evaluating every
chunk of code when exporting.
Emacs tips and tricks
=====================
Cheat-sheets
------------
Learning Emacs and Org-Mode can be difficult as there is an inordinate
amount of shortcuts. Many people have thus come up with cheat-sheats.
Here is a selection in case it helps:
### Emacs
- [Common and step-by-step Emacs shortcuts for our *reproducible
research*
configuration](https://app-learninglab.inria.fr/gitlab/learning-lab/mooc-rr-ressources/blob/master/module2/ressources/rr_org/journal.org)
- [The official GNU emacs
refcard](https://www.gnu.org/software/emacs/refcards/pdf/refcard.pdf)
- Two graphical cheat-sheats by Sacha Chua on
![](http://sachachua.com/blog/wp-content/uploads/2013/05/How-to-Learn-Emacs-v2-Large.png)
and on
![](http://sachachua.com/blog/wp-content/uploads/2013/08/20130830-Emacs-Newbie-How-to-Learn-Emacs-Keyboard-Shortcuts.png).
### Org-mode
- [Common and step-by-step org-mode shortcuts for our *reproducible
research*
configuration](https://app-learninglab.inria.fr/gitlab/learning-lab/mooc-rr-ressources/blob/master/module2/ressources/rr_org/journal.org)
- [The official org-mode
refcard](https://orgmode.org/worg/orgcard.html)
- [The official description of the org-mode
syntax](https://orgmode.org/worg/dev/org-syntax.html) and a
[relatively concise description of the org-mode
syntax](https://gist.github.com/hoeltgman/3825415).
Video tutorials
---------------
For those of you who prefer video explanations, here is a [Youtube
channel with many step by step emacs
tutorials](https://www.youtube.com/playlist?list=PL9KxKa8NpFxIcNQa9js7dQQIHc81b0-Xg).
Additional useful emacs packages
--------------------------------
### Company-mode
[Company-mode](http://company-mode.github.io/) is a text completion
framework for Emacs. It allows to have smart completion in emacs for the
most common languages. If you feel this is needed, you should follow the
instructions from the official Web page:
[<http://company-mode.github.io/>](http://company-mode.github.io/)
### Magit
[Magit](https://magit.vc/) is an Emacs interface for Git. Its usage is
briefly illustrated in the context of this MOOC in a [video
tutorial](https://www.fun-mooc.fr/courses/course-v1:inria+41016+session01bis/jump_to_id/9cfc7500f0ef46d288d2317ec7b037b4)
("*Utilisation Emacs/git*" in French).
It is very powerful and we use it on a daily basis but you should
definitely understand what git does behind the scenes beforehand. If you
feel this would be useful for you, you should follow [this visual
walk-through](https://magit.vc/screenshots/) or [this really short
"crash course"](https://www.emacswiki.org/emacs/Magit). If you installed
the previous "*reproducible research*" emacs configuration, you can
easily invoke magit by using `C-x g`.
Other resources
---------------
- [The compact Org-mode Guide](https://orgmode.org/orgguide.pdf)
- [Many examples illustrating the use of different languages in
org-mode](https://github.com/dfeich/org-babel-examples)
......@@ -17,6 +17,26 @@ the [[https://www.fun-mooc.fr/courses/course-v1:inria+41016+session01bis/jump_to
The next section provides information on how to install emacs.
* Table of Contents :TOC:
- [[#installing-emacs-org-mode-ess-and-auctex][Installing emacs, org-mode, ess, and auctex.]]
- [[#linux-debian-ubuntu][Linux (Debian, Ubuntu)]]
- [[#macos][macOS]]
- [[#windows][Windows]]
- [[#all-platforms-pretty-code-in-html-export][All platforms: pretty code in HTML export]]
- [[#a-simple-reproducible-research-emacs-configuration-][A simple "/reproducible research/" emacs configuration ]]
- [[#step-0-backup-and-download-our-configuration][Step 0: Backup and download our configuration]]
- [[#step-1-prepare-your-journal][Step 1: Prepare your journal]]
- [[#step-2-set-up-emacs-configuration][Step 2: Set up Emacs configuration]]
- [[#step-3-adapt-the-configuration-to-your-specific-needs-if-required][Step 3: Adapt the configuration to your specific needs if required]]
- [[#step-4-check-whether-the-installation-is-working-or-not][Step 4: Check whether the installation is working or not]]
- [[#step-5-open-and-play-with-your-journal][Step 5: Open and play with your journal:]]
- [[#a-stub-of-a-replicable-article][A stub of a replicable article]]
- [[#emacs-tips-and-tricks][Emacs tips and tricks]]
- [[#cheat-sheets][Cheat-sheets]]
- [[#video-tutorials][Video tutorials]]
- [[#additional-useful-emacs-packages][Additional useful emacs packages]]
- [[#other-resources][Other resources]]
* Installing emacs, org-mode, ess, and auctex.
** Linux (Debian, Ubuntu)
We provide here only instructions for Debian-based distributions. Feel
......
C028AL_slides_module2-en-gz.pdf: slides_module2.pdf
mv $< $@
C028AL_slides_module2-fr-gz.pdf: diapos_module2.pdf
mv $< $@
%-gz.pdf: %.pdf
gzprez $<
%.pdf: %.tex
pdflatex --shell-escape $^
pdflatex --shell-escape $^
%.tex: %.org
emacs -batch --eval "(setq enable-local-eval t)" --eval "(setq enable-local-variables t)" $^ --funcall org-beamer-export-to-latex
# sed -i -e 's|includegraphics\(.*\)../assets/img/|includegraphics\1../assets/img/thumbnail/|' -e 's/\.png}/.jpg}/i' $@
#+TITLE: La vitrine et l'envers du décor : \newline Le document computationnel
#+AUTHOR: @@latex:{\large Arnaud Legrand} \\ \vspace{0.2cm}LIG, Univ. Grenoble Alpes, CNRS, Inria\\ \vspace{0.2cm} \texttt{arnaud.legrand@imag.fr}@@
#+LATEX_CLASS: beamer
#+LATEX_CLASS_OPTIONS: [presentation,bigger]
#+STARTUP: beamer indent
#+LANGUAGE: fr
#+PROPERTY: header-args :eval no-export
#+OPTIONS: H:2 tags:nil
#+OPTIONS: num:t toc:nil \n:nil @:t ::t |:t ^:nil -:t f:t *:t <:t
#+OPTIONS: TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-toc
# #+OPTIONS: author:nil email:nil creator:nil timestamp:t
#+TAGS: noexport(n)
#+EXCLUDE_TAGS: noexport
#+LATEX_HEADER: \usepackage[normalem]{ulem}
#+LATEX_HEADER: \usepackage{svg}
#+LATEX_HEADER: \setbeamercovered{invisible}
#+LATEX_HEADER: \AtBeginSection[]{\begin{frame}<beamer>\frametitle{Où en sommes nous ?}\tableofcontents[currentsection]\end{frame}}
#+LATEX_HEADER: \beamertemplatenavigationsymbolsempty
#+LATEX_HEADER: \usepackage{tikzsymbols}
#+LATEX_HEADER: \def\smiley{\Smiley[1][green!80!white]}
#+LATEX_HEADER: \def\frowny{\Sadey[1][red!80!white]}
#+LATEX_HEADER: \def\winkey{\Winkey[1][yellow]}
#+LATEX_HEADER: \usepackage{color,soul}
#+LATEX_HEADER: \definecolor{lightblue}{rgb}{1,.9,.7}
#+LATEX_HEADER: \sethlcolor{lightblue}
#+LATEX_HEADER: \newcommand{\muuline}[1]{\SoulColor\hl{#1}}
#+LATEX_HEADER: \makeatletter
#+LATEX_HEADER: \newcommand\SoulColor{%
#+LATEX_HEADER: \let\set@color\beamerorig@set@color
#+LATEX_HEADER: \let\reset@color\beamerorig@reset@color}
#+LATEX_HEADER: \makeatother
#+LATEX_HEADER: \let\hrefold=\href
#+LATEX_HEADER: \renewcommand{\href}[2]{\hrefold{#1}{\SoulColor\hl{#2}}}
#+LaTeX: \let\alert=\structure % to make sure the org * * works
#+LaTeX: \begin{frame}{Plan du cours}\tableofcontents\end{frame}
* Test et informations :noexport:
** Images
Origin of every image used in this series of slides:
- PhD Comics:
- [[file:img/phd010708.png][phd010708.png]]: http://phdcomics.com/comics/archive.php?comicid=961
c'est du fan art, là ;) je cite phdcomics dans la vidéo donc je
pense qu'on est bon et je doute qu'il vienne nous embêter vu le sujet.
- [[file:img/in_science_we_trust.jpg][in_science_we_trust.jpg]]: https://www.google.fr/search?client=firefox-b&dcr=0&biw=1450&bih=783&tbm=isch&sa=1&q=in+science+we+trust&oq=in+science+we+trust&gs_l=psy-ab.3..0i13k1j0i30k1l3.2692.5748.0.5946.6.5.0.0.0.0.694.1147.0j3j5-1.4.0....0...1.1.64.psy-ab..2.4.1144...0i7i30k1.0.JVlXKVLc9a4#imgrc=bt5vbb5C4e9fHM
puis http://www.patheos.com/blogs/unreasonablefaith/2012/03/a-better-motto/in-science-we-trust-coin/ normalement
- [[file:img/Researcher-test.jpg][Researcher-test.jpg]]: https://fr.wikipedia.org/wiki/Imagerie_par_r%C3%A9sonance_magn%C3%A9tique_fonctionnelle#/media/File:Researcher-test.jpg
- [[file:img/flipping_fiasco.png][flipping_fiasco.png]]: https://people.ligo-wa.caltech.edu/~michael.landry/calibration/S5/getsignright.pdf
- [[file:img/in_science_we_trust_small.jpg][in_science_we_trust_small.jpg]]: voir file:img/in_science_we_trust.jpg
-
[[file:img/box-she-s-told-not-to-open-in-it-the-gods-had-placed-all-the-evils-9vbl9q-clipart.jpg][box-she-s-told-not-to-open-in-it-the-gods-had-placed-all-the-evils-9vbl9q-clipart.jpg]]:
trouvé à la base sur
https://politicsinpinkdotcom.files.wordpress.com/2016/12/box-she-s-told-not-to-open-in-it-the-gods-had-placed-all-the-evils-9vbl9q-clipart.jpg
mais visiblement achetable ici:
http://www.istockphoto.com/fr/vectoriel/femme-laissant-d%C3%A9mons-de-la-poitrine-gm165517954-24325536
*à acheter*.
- [[file:img/in_code_we_trust.jpg][in_code_we_trust.jpg]]: https://www.google.fr/url?sa=i&rct=j&q=&esrc=s&source=images&cd=&cad=rja&uact=8&ved=0ahUKEwiJ2ZfIi4fXAhUJVxQKHb-xCBoQjRwIBw&url=https%3A%2F%2Fwww.spreadshirt.com%2Fa%2Bprogrammer%2Blife-A14770086&psig=AOvVaw1ZDWatztzt2-ycU-7qy-Gh&ust=1508859944930121
- [[file:img/iceberg.jpg][iceberg.jpg]]: http://www.jdubuzz.com/files/2016/03/iceberg-principle.jpg
- [[file:img/iceberg_publication-1.png][iceberg_publication-1.png]] and others alike:
- Crédits Juliana Freire: slides 2 à 5 de http://catt.nyu.edu/sites/default/files/files/Provenance_In_Data_Exploration.pdf
- https://en.wikipedia.org/wiki/Large_Hadron_Collider#/media/File:CERN_LHC.jpg
- https://fr.wikipedia.org/wiki/T%C3%A9lescope#/media/File:Hubble_01.jpg
- https://en.wikipedia.org/wiki/DNA_sequencer#/media/File:DNA-Sequencers_from_Flickr_57080968.jpg
- https://cnet3.cbsistatic.com/img/Ly9WLBFBoWxby2UraBktS1ftx90=/2014/06/10/1bd4587d-63a5-4d1a-b2fe-c6b692daa9bb/plantsensors-1.jpg
- http://www.cerfacs.fr/avbp7x/img/FULLSCREEN/explosion-masri_incite_1Md.png
- https://fr.wikipedia.org/wiki/Treemap#/media/File:Carte-proportionnelle-france.png
- https://fr.wikipedia.org/wiki/Repr%C3%A9sentation_graphique_de_donn%C3%A9es_statistiques
- https://fr.wikipedia.org/wiki/Visualisation_d%27informations#/media/File:InteractionAandB.png
- [[file:img/RStudio-Logo-Blue-Gradient.png and file:img//knitr.png][RStudio-Logo-Blue-Gradient.png and file:img//knitr.png]]: https://www.rstudio.com/about/logos/
- [[file:img/jumping_penguin.png][jumping_penguin.png]]: http://www.istockphoto.com/be/photo/saut-penguins-de-papou-sur-iceberg-gm466554153-33737494
*à acheter*.
* Internal refs/notes :noexport:
** phdcomics
- version control : http://phdcomics.com/comics/archive.php?comicid=1531
- http://r-bio.github.io/intro-git-rstudio/
- https://xkcd.com/1597/
- http://phdcomics.com/comics/archive.php?comicid=961
** Pandoc
- https://enacit1.epfl.ch/markdown-pandoc/
- https://www.markdowntutorial.com/
** Jupyter
*** Install
#+begin_src sh :results output :exports both
sudo apt-get install jupyter-notebook
sudo apt-get install python3-pip
sudo apt-get install python3-matplotlib python3-numpy
#+end_src
Then following https://github.com/kirbs-/hide_code (note sure this is
as useful as I thought though :()
#+begin_src sh :results output :exports both
sudo pip3 install hide_code
sudo jupyter-nbextension install --py hide_code
jupyter-nbextension enable --py hide_code
jupyter-serverextension enable --py hide_code
#+end_src
Pour que l'export via latex fonctionne:
#+begin_src shell :results output :exports both
sudo apt-get install wkhtmltopdf
sudo apt-get install texlive-xetex
#+end_src
Pour avoir R:
#+begin_src shell :results output :exports both
sudo apt-get python3-rpy2
#+end_src
Pour avoir le [[https://github.com/brospars/nb-git][git push/pull dans les notebooks]]:
#+begin_src shell :results output :exports both
jupyter nbextension install https://raw.githubusercontent.com/brospars/nb-git/master/nb-git.js
jupyter nbextension enable nb-git
#+end_src
Autres extensions (code-folding): https://stackoverflow.com/questions/33159518/collapse-cell-in-jupyter-notebook
#+begin_src shell :results output :exports both
pip3 install jupyter_contrib_nbextensions
# jupyter contrib nbextension install --user # not done yet
#+end_src
https://stackoverflow.com/questions/33159518/collapse-cell-in-jupyter-notebook
(collapsible headings)
Pour avoir le kernel R (from https://irkernel.github.io/installation/):
#+begin_src R :results output graphics :file (org-babel-temp-file "figure" ".png") :exports both :width 600 :height 400 :session *R*
install.packages(c('repr', 'IRdisplay', 'evaluate', 'crayon', 'pbdZMQ', 'devtools', 'uuid', 'digest'))
devtools::install_github('IRkernel/IRkernel')
# Don’t forget step 2/2!
IRkernel::installspec()
#+end_src
*** Export
http://markus-beuckelmann.de/blog/customizing-nbconvert-pdf.html
https://nbconvert.readthedocs.io/en/latest/
#+begin_src sh :results output :exports both
ipython3 nbconvert --to pdf Untitled.ipynb
#+end_src
*** Pour aller plus loin
- https://www.dataquest.io/blog/jupyter-notebook-tips-tricks-shortcuts/
* M2-S0: Le document computationnel
** La vitrine et l'envers du décor: Le document computationnel
\vspace{-1cm}
\begin{flushright}
\includegraphics[width=7cm]{img/phd010708.png}
\end{flushright}
\vspace{-1cm}
1. Exemples récents d'études assez discutées
2. Pourquoi est-ce difficile ?
3. Le document computationnel : principe
4. Prise en main de l'outil Au choix :
- Jupyter
- Rstudio
- Org-Mode
5. Travailler avec les autres
6. Analyse comparée des différents outils
# Note:
# Pour vous convaincre de l'importance de cette traçabilité, je vais
# commencer par vous présenter quelques exemples récents de travaux dont
# les résultats ont été particulièrement controversés et discutés. Ils
# illustrent à quel point la capacité à pouvoir inspecter les méthodes
# utilisées pour produire tel ou tel résultat est essentielle.
# Comme nous le verrons, la plupart des problèmes rencontrés sont liées
# au calcul, qu'il s'agisse d'erreurs de programmations, de
# transformations de données peu rigoureuses, ou bien de procédures
# statistiques discutables.
# Une fois les origines de tous ces problèmes identifiées, je vous
# présenterai rapidement quelles bonnes pratiques mettre en oeuvre afin
# de les éviter.
# En particulier, je vous expliquerai ce que c'est que ce fameux
# document computationnel: un document qui permet de présenter
# agréablement des résultats à d'autres (ce que j'appelle la vitrine)
# mais aussi d'accéder à l'ensemble des calculs sous-jacents (ce que
# j'appelle l'envers du décor).
# Il existe plusieurs formats de tels documents et nous vous proposons
# trois environnements permettant d'en produire facilement. Ces trois
# environnements se distinguent par le niveau de technicité nécessaire à
# leur mise en oeuvre. À vous de choisir celui qui vous convient le
# mieux quitte à en essayer un autre plus tard.
# Jupyter, le premier, a été intégré au MOOC et au gitlab et ne
# nécessite donc aucune installation de votre part. C'est donc le plus
# simple à mettre en oeuvre. L'ensemble des données et des calculs sera
# hébergé sur nos serveurs, mais vous pourrez y accéder et les récupérer
# sur votre propre ordinateur à tout moment via le gitlab si vous le
# souhaitez. Jupyter vous permettra de gérer des notebooks et d'utiliser
# le langage python3 ou bien le langage R.
# Rstudio, le second, est un environnement de développement spécifique
# au langage R. Il vous faudra l'installer sur votre machine et
# synchroniser vos productions avec le gitlab. C'est un logiciel très
# bien maintenu, qui fonctionne aussi bien sous linux et mac que sous
# windows et son installation ne devrait pas poser de difficulté
# particulière. Si vous êtes déjà familier avec le langage R, c'est
# l'option que je vous recommande. L'avantage de cette approche est que
# vous aurez à la fin du MOOC sur votre machine un environnement de
# travail directement prêt à l'emploi. Avec Rstudio, il est également
# possible d'utiliser occasionnellement du code python mais si vous avez
# l'intention de faire principalement du python, il vaut mieux utiliser
# jupyter.
# Enfin, OrgMode, est clairement celui qui est le plus délicat à mettre
# en oeuvre mais c'est aussi celui que Konrad, Christophe et moi-même
# utilisons quotidiennement aussi bien pour gérer notre cahier de
# laboratoire que pour rédiger des articles ou des notes
# techniques. Nous nous sommes donc dit qu'il pouvait être intéressant
# de vous le présenter. OrgMode nécessite l'installation d'Emacs, un
# éditeur de texte qui révèle toute sa puissance dans un environnement
# linux ou mac. Il permet de combiner très efficacement différents
# langages et est par certains aspects moins limité que les deux
# précédents. Cette option est à réserver à un public averti mais le jeu
# en vaut la chandelle.
# Une fois familiarisé avec un de ces environnements, nous vous
# proposerons une petite séance pratique dont l'objectif sera de
# produire un petit document computationnel.
# Les dernières séquences peuvent être visionnées indépendemment et
# traitent de sujets un peu plus techniques, en particulier de comment
# utiliser de tels outils avec vos co-auteurs qui peuvent avoir leurs
# propres habitudes, ou de comment produire des documents avec un style
# bien spécifique.
# Nous concluons enfin ce module avec une comparaison de ces différents
# outils et une présentation des bénéfices d'une utilisation
# quotidienne.
* M2-S1: Exemples récents d'études assez discutées
** Le document computationnel
1. *Exemples récents d'études assez discutées*
2. Pourquoi est-ce difficile ?
3. Le document computationnel : principe
4. Prise en main de l'outil. Aux choix :
- Jupyter
- Rstudio
- Org-Mode
5. Travailler avec les autres
6. Analyse comparée des différents outils
** Exemples récents d'études assez discutées
file:img/in_science_we_trust.jpg
# Note:
# Je vous avais promis quelques exemples récents de travaux dont les
# résultats ont été particulièrement controversés et discutés. C'est ce
# que je vais vous présenter dans cette séquence.
** Économie : politiques d'austérité (1/2)
*** 2010
# - /gross debt [..] exceeding 90 percent of the economy has a
# significant negative effect on economic growth/
#+BEGIN_QUOTE
Lorsque la dette extérieure brute atteint 60 pourcents du PIB, la
croissance annuelle d'un pays diminue de deux pourcents.
[..] pour des niveaux de dette extérieure dépassant 90 pourcents du
PIB, la croissance annuelle est à peu près divisée par deux.
\flushright -- [[https://en.wikipedia.org/wiki/Growth_in_a_Time_of_Debt][Reinhart et Rogoff]]: /Growth in a Time of Debt/
#+END_QUOTE
# - données non publiées mais disponibles sur demande
# Note:
# Commençons par des travaux en économie. 2007: crise des subprimes aux
# États-Unis. De 2008 à 2009, deux économistes prestigieux, Carmen
# Reinhart et Kenneth Rogoff présentent leurs travaux et annoncent que
# la crise financière est loin d'avoir produite toutes ses
# conséquences. En 2010, ils publient un article intitulé "Growth in a
# Time of debt" qui étudie le lien entre dette et croissance.
# Leurs principales conclusions sont que lorsque lorsque la dette
# extérieure d'un pays dépasse 90% du PIB, les conséquences sur la
# croissance sont dramatiques.
# De nombreux politiciens, journalistes et activistes s'appuient sur cet
# article pour soutenir la mise en place de politiques d'austérité
# budgétaire.
** Économie : politiques d'austérité (2/2)
*** 2013
# - Herndon, Ash and Pollin: /While using RR's working spreadsheet, we
# identified *coding errors*, *selective exclusion* of/ /available data,
# and *unconventional* weighting of summary *statistics*./
#+BEGIN_QUOTE
En utilisant leurs feuilles Excel,
nous avons identifié des *erreurs de programmation*, des *exclusions*
de certaines données, et des pondérations *statistiques non
conventionnelles*.
\flushright -- Herndon, Ash et Pollin
#+END_QUOTE
# #+BEGIN_EXPORT html
# <br/>
# #+END_EXPORT
# - Wray: /combining data across centuries, exchange rate regimes,
# public and private/ /debt, and debt denominated in foreign currency
# as well as domestic currency/
#+BEGIN_QUOTE
R&R combinent des données de siècles
différents, des régimes de changes différents, des dettes privées et
publiques, et des dettes exprimées en monnaies étrangères et
nationales.
\flushright -- Wray
#+END_QUOTE
# Note:
# Ces seuils de 90% ainsi que l'ampleur des conséquences sont très
# discutés, d'autant plus que certains chercheurs échouent à obtenir des
# résultats similaires en utilisant les données disponibles
# publiquement. Ils demandent donc à Reinhart et Rogoff l'ensemble des
# données et des feuilles de calculs utilisées dans l'étude et ces
# derniers finissent par leur fournir.
# Dans ces feuilles, des erreurs de calcul évidentes apparaissent
# rapidement ainsi que des traitement de données assez douteux
# (exclusion de données, pondérations suspectes, etc.).
# Reinhart et Rogoff répondent point par point en expliquant que ces
# quelques erreurs ne changent rien au résultat final, que leur façon de
# calculer les statistiques sont tout à fait standard.
# En fait, une fois les détails révélés, pour beaucoup de chercheurs ces
# calculs n'ont pas beaucoup de sens, les valeurs utilisées sont très
# discutables, et il est malhonnête d'utiliser ces travaux pour
# justifier une politique d'austérité budgétaire.
# Mais le mal est fait. Pendant plus de trois ans, l'austérité n'est pas
# présentée comme un choix mais comme une nécessité. Et quand bien même
# l'article original est considéré comme non pertinent par les
# économistes, ces idées ont fait leur chemin et sont difficiles à
# détrôner.
# Au delà du caractère idéologique de ce genre de travaux, une des
# raisons pour lesquelles ce débat a mis autant de temps à avoir lieu
# est lié à la non publication de l'ensemble des procédures de calcul et
# des données utilisées, pratique courante en économie. Sous les feux
# de la rampe, les auteurs ont bien été forcés de mettre à disposition
# ce qui sous-tendait leur travaux mais sans pression médiatique
# particulière, en général, rien ne se passe...
** IRM fonctionnelle
# file:assets/img/Irmf.jpg&size=cover
- 2010 : [[https://www.researchgate.net/publication/255651552_Neural_correlates_of_interspecies_perspective_taking_in_the_post-mortem_Atlantic_Salmon_an_argument_for_multiple_comparisons_correction][Bennett et al. et le saumon mort]] $\smiley$
- 2016 : [[http://www.pnas.org/content/113/28/7900.abstract][Eklund, Nichols, and
Knutsson]]. [[http://www.sciencealert.com/a-bug-in-fmri-software-could-invalidate-decades-of-brain-research-scientists-discover][A
bug in fmri software could invalidate 15 years of brain research]]
(/40 000 articles/)
- 2016 : Mais [[https://www.cogneurosociety.org/debunking-the-myth-that-fmri-studies-are-invalid/][c'est plus subtil que \c{c}a]]. [[http://blogs.warwick.ac.uk/nichols/entry/bibliometrics_of_cluster/][Nichols]]. /\approx 3 600
études concernées/
Des méthodes statistiques à améliorer mais pas de
remise en cause fondamentale.
file:img/Researcher-test.jpg
# Note:
# Continuons avec un autre exemple: l'imagerie cérébrale, qui permet
# d'observer l'activité du cerveau d'un individu lorsqu'il effectue une
# tâche cognitive et ainsi de mieux comprendre la structure et le
# fonctionnement du cerveau. L'IRM fonctionnelle est l'une de ces
# techniques et mesure de très faibles variations locales du taux
# d'oxygénation du sang dans le cerveau.
# En 2010, Craig Bennett et ses encadrants ont une idée saugrenue. Ils
# placent un saumon mort dans un appareil d'IRM et lui présentent des
# images. Étonnamment, ils observent des signes d'activité cérébrale, ce qui est
# pour le moins surprenant puisque le saumon est bel et bien mort. Aussi
# drôle que cela puisse paraître, Bennett et ses encadrants savent très
# bien ce qu'ils font. Les données brutes obtenues lors d'une IRM sont
# très bruitées et toute une série de calculs et de tests statistiques
# sont appliqués pour transformer ces données en images
# intelligibles. Mais il arrive que le bruit soit trop important, que la
# machine soit mal calibrée, que la procédure de calcul soit inadaptée
# et que des signaux apparaissent fortuitement.
# Leur article rédigé avec un ton très humoristique fait sensation car
# il met le doigt sur des faiblesses méthodologiques.
# L'an dernier, des collègues me sachant intéressé par ces problèmes de
# réplication me font suivre un article récent assez alarmant. Cet article présente un
# problème dans les procédures statistiques utilisées dans les logiciels
# d'analyse d'IRMf les plus courants, ce qui remet potentiellement en
# cause les résultats obtenus ces quinze dernières années. Étant donnée
# l'ampleur de l'erreur, les auteurs concluent que 40,000 articles
# pourraient être concernés. De plus, les données étant très
# volumineuses dans ce domaine, elles ne sont pas archivées et il ne
# sera pas possible de simplement les réanalyser. L'ensemble des
# expériences seraient à refaire...
# En fait, suite aux retours qui leurs sont faits, les auteurs revoient
# rapidement à la baisse leurs estimations assez alarmistes.
# Au final, le problème méthodologique et la capacité à vérifier les
# études suite à des erreurs de calcul reste entier même s'il ne remet
# pas pour autant en cause l'ensemble des résultats obtenus ces
# dernières années.
** Les fausses structures de protéines
#+LaTeX: \begin{columns}\begin{column}{6.3cm}
*Geoffrey Chang* : étude de la structure de protéines présentes dans
des bactéries résistant aux antibiotiques.
\small MsbA de Escherichia Coli (Science, 2001), Vibrio cholera
(Mol. Biology, 2003), Salmonella typhimurium (Science, 2005)
#+LaTeX: \end{column}\begin{column}{3.5cm}
#+LaTeX: \hspace{-.3\linewidth}\includegraphics[width=1.2\linewidth]{img/flipping_fiasco.png}
#+LaTeX: \end{column}\end{columns}\medskip
*2006* : Incohérences, alertes, puis 5 rétractations
#+BEGIN_QUOTE
a homemade data-analysis program had flipped
two columns of data, inverting the electron-density map from which his
team had derived the protein structure.
\flushright -- [[https://people.ligo-wa.caltech.edu/~michael.landry/calibration/S5/getsignright.pdf][une "erreur de programmation"]]
#+END_QUOTE
# Note:
# Un dernier exemple, cette fois-ci en cristallographie.
# Geoffray Chang est un chercheur à la trajectoire fulgurante,
# récompensé par de nombreux prix. Son équipe, basée au Scripps
# Institute à l'Université de Californie San Diego, a publié une série
# d'articles dans des revues prestigieuses et détaillant la structure de
# certaines protéines présentes dans les membranes de cellules. Ces
# protéines jouent un rôle essentiel dans la résistance de ces bactéries
# à certains médicaments et connaître leur structure est une étape
# importante dans la compréhension de leur fonctionnement.
# Hélas, peu de temps après, d'autres équipes de chercheurs qui étudient
# des protéines très similaires rapportent des structures anormalement
# différentes de celles publiées par Chang et son équipe. En lisant ces
# travaux Chang, horrifié, remonte vite à la source du problème.
# Un des codes d'analyse aurait inversé deux
# colonnes de données et ainsi inversé la répartition de la densité
# d'électrons à partir de laquelle la structure finale de la protéine
# est calculée. D'après Chang, ce code aurait été hérité d'un autre
# laboratoire et s'était également répandu depuis dans d'autres équipes.
# Même si toute l'acquisition des données avait été faite soigneusement,
# ce n'était pas le cas de l'analyse et ce petit grain de sable a
# conduit à la rétractation immédiate de 5 articles par Chang et son
# équipe. Ces publications ont eu un impact énorme sur la communauté, à
# tel point que plusieurs années après la rétractation, les résultats
# contradictoires avec ceux de Chang paraissaient suspects avaient du
# mal à être publiés.
** Crise de foi ?
#+LaTeX: \begin{columns}\begin{column}{6.3cm}
- [[http://www.nature.com/nrd/journal/v10/n9/full/nrd3439-c1.html?foxtrotcallback=true][Oncologie]] : "/plus de la moitié des études publiées, même dans des
journaux prestigieux, ne/ /peuvent être reproduites en laboratoire
industriel/"
- [[http://theconversation.com/we-found-only-one-third-of-published-psychology-research-is-reliable-now-what-46596][Psychologie]] : "réplication d'une centaine d'articles /seulement un
tiers de résultats cohérents/"
#+LaTeX: \end{column}\begin{column}{3.5cm}
#+LaTeX: \hspace{-.1\linewidth}\includegraphics[width=1\linewidth]{img/in_science_we_trust_small.jpg}
#+LaTeX: \end{column}\end{columns}\medskip
#+BEGIN_CENTER
*Lanceurs d'alerte* ou
*institutions malades* ?
#+END_CENTER
*** La _remise en cause_ fait partie du processus scientifique\pause
*** Tout comme la _rigueur_ et la _transparence_...
# Note:
# Il n'y a à ce jour pas un domaine des science qui ne soit épargné par
# ces difficultés à reproduire les travaux publiés. En oncologie, un
# article récemment publié rapporte que plus de la moitié des études
# publiées ne peuvent être reproduites en laboratoire industriel, et ce
# même si les études sont publiées dans des journaux prestigieux.
# En psychologie, les capacités à reproduire les résultats publiés sont
# également très basses.
# Le problème est méthodologique mais également certainement
# sociologique, lié à une pression productiviste trop importante. Mais
# attention aussi à ne pas donner non plus trop d'importance aux signaux
# d'alertes que nous venons de voir...
# Le problème est compliqué mais il faut garder à l'esprit que la remise
# en cause fait partie du processus scientifique. Il n'est donc pas
# surprenant que de telles difficultés de reproduction de travaux
# scientifiques soit présentes.
# Cependant, deux autres caractéristiques essentielles du processus
# scientifique sont la rigueur et la transparence et il est clair que
# dans l'ensemble des cas que nous venons de voir il manquait souvent
# l'un et l'autre...
* M2-S2: Pourquoi est-ce difficile ?
** Le document computationnel
1. Exemples récents d'études assez discutées
2. *Pourquoi est-ce difficile ?*
3. Le document computationnel : principe
4. Prise en main de l'outil. Au choix :
- Jupyter
- Rstudio
- Org-Mode
5. Travailler avec les autres
6. Analyse comparée des différents outils
** Pourquoi est-ce difficile ?
file:img/box-she-s-told-not-to-open-in-it-the-gods-had-placed-all-the-evils-9vbl9q-clipart.jpg
# Note: Comme nous l'avons vu, reproduire les travaux de recherche, même
# publiés dans des revues prestigieuses est souvent assez
# difficile. Dans cette séquence, nous allons identifier les difficultés
# les plus communes.
** 1) Le manque d'informations
Expliciter :
+ *Sources* et *données*
#+BEGIN_CENTER
/Données non disponibles = résultats difficiles à vérifier/
#+END_CENTER
+ *Choix*
#+BEGIN_CENTER
/Choix non expliqués = choix suspicieux/
#+END_CENTER
#+LaTeX: \bigskip
*** Le cahier de laboratoire peut vous aider
# Note: La première source de difficultés rencontrées lors de tentatives
# de reproduction est tout simplement le manque d'informations.
# Si on ne prend pas soin d'expliciter comment on a obtenu nos données
# et qu'on les garde secrètes, il est certain qu'il va être difficile
# pour une tierce personne de vérifier si elle arrive aux mêmes
# conclusions ou pas.
# # C'est étrange car mettre les données utilisées à disposition permet au
# # lecteur d'en évaluer la qualité (voire d'y trouver des erreurs). Sans
# # cette évaluation, difficile pour le lecteur de savoir quelle confiance
# # avoir dans les conclusions de l'article.
# De même expliciter les choix effectués à chacune des étapes de l'étude
# s'avère essentiel. Quel protocole expérimental a été choisi et
# pourquoi ? Quelles données ont été conservées ? Quelles données ont
# été soigneusement écartées et pourquoi ? Quelle procédure statistique
# a été utilisée et les hypothèses sous-jacentes étaient elles
# raisonnables ? Etc.
# Après tout, on doit toujours faire des choix à un moment donné. Mais
# ne pas expliquer ces choix, même en étant rigoureux et de bonne foi,
# c'est prendre le risque que les lecteurs deviennent
# suspicieux. D'autre part, être totalement transparent sur ces choix,
# c'est permettre à d'autres (ou à vous-même) de décider s'il est
# nécessaire de revenir dessus ou pas
# Pour garder trace de tous ces choix et des informations sur ces
# données, le cahier de laboratoire un outil essentiel. Encore faut-il
# ensuite mettre ces informations à disposition, mais nous reviendrons
# sur ce point par la suite.
** 2) L'ordinateur, [[http://theconversation.com/how-computers-broke-science-and-what-we-can-do-to-fix-it-49938][source d'erreurs]]
- *Point and click* :
- *Les tableurs* : [[https://qz.com/768334/years-of-genomics-research-is-riddled-with-errors-thanks-to-a-bunch-of-botched-excel-spreadsheets/][erreurs de programmation]] et de manipulation de données
-
~Membrane-Associated Ring Finger (C3HC4) 1, E3 Ubiquitin Protein
Ligase~ \to ~MARCH1~ \to 2016-03-01 \to 1456786800
-
~2310009E13~ \to 2.31E+19
- *Pile logicielle complexe*
- *Bug* : /Programmer, c'est dur !/
# Note:
# La deuxième source de difficultés rencontrées lors de tentatives
# de reproduction de travaux est tout simplement les erreurs induites
# par l'utilisation effrénée des ordinateurs.
# Comme toute innovation technologique, les ordinateurs nous permettent
# d'aller plus vite, plus loin mais aussi de faire des erreurs plus
# facilement et plus rapidement...
# Au premier plan des sources d'erreurs, ces logiciels intuitifs où
# l'interaction se fait à la souris et qui ne permettent pas
# d'expliciter ce qui est calculé et à partir de quoi. Leur simplicité
# d'utilisation incite à les utiliser pour tout, même pour ce pour quoi
# ça n'est pas vraiment prévu.
# Il est par exemple très difficile de comprendre la logique du calcul
# ayant lieu dans une feuille excel pleine de macros. Bien sûr, il est
# possible de gérer des stocks et la comptabilité d'une entreprise avec
# un tableur, mais ceux qui ont déjà eu à faire à ce genre
# d'abominations savent qu'un ERP permet d'éviter bien des soucis. Et
# bien de la même façon, un tableur n'est pas le bon outil pour faire
# des statistiques ou du traitement de données !
# Tenez, quelques exemples d'anecdotes effroyables liées à l'utilisation
# d'un tableur. En génomique, il est bien pratique de donner des petits
# noms aux gènes tels que celui-ci. Celui-ci, c'est MARCH1. Seulement
# pas mal de tableurs croient bien faire en l'interprétant
# comme une date et par effet de bord comme le nombre de secondes
# écoulées depuis le 1er janvier 1970... L'identifiant de gène 231 000
# 9E13 se retrouve lui aussi fréquemment convertit en nombre. Alors bien
# sûr, il n'y a peut-être qu'une vingtaine de gènes concernés par ce
# genre de problème sur les 30,000 du génome humain, mais c'est quand
# même assez désagréable.
# De manière générale, il est courant de se reposer sur une pile
# logicielle complexe. Complexe et souvent mal maîtrisée. Combien
# d'études reposent ainsi sur des logiciels propriétaires, sortes de
# boites noires dont on ne maîtrise pas le contenu et qui appliquent
# aveuglement des procédures de calculs et de transformations de
# données?
# # - l'utilisation de telle ou telle méthode plutôt qu'une autre est
# # souvent discutable
# Alors, je ne suis pas en train de dire qu'il faut tout reprogrammer
# soi même. Ce n'est bien sûr par la meilleure façon d'échapper aux
# bugs. Dans les cas de l'étude Reinhart et Rogoff ou des fausses
# structures de protéines de Chang, les erreurs venaient de programmes
# maisons.
# Mais il me semble essentiel d'être en mesure de déterminer dans son
# analyse si chacune des briques est digne de confiance ou pas. Et si
# l'un des composants, par sa nature, l'interdit, il faut sérieusement
# songer à le remplacer.
** L'informatique, seule responsable ?
*Le manque de rigueur et d'organisation*
- Pas de backup
- Pas d'historique
- Pas de contrôle qualité
# Note:
# Enfin, la dernière cause méthodologique de non-reproductibilité et
# source d'erreurs est certainement le mangue de rigueur et
# d'organisation.
# Même si le stockage ne coûte plus rien de nos jours, la sauvegarde des
# données est souvent mal assurée et il est courant d'en perdre suite à
# une mauvaise manipulation, ou bien à la suppression de son compte
# informatique lors du passage d'une institution à une autre.
# En l'absence de mécanisme de gestion de version, il est courant
# de remplacer par inadvertance d'anciennes données par de nouvelles et
# de ne plus arriver à accéder à d'anciennes observations.
# Dans un certain nombre de domaines, l'utilisation de plans
# d'expériences randomisés ou de pré-études (study pre-registration),
# n'est absolument pas systématique. De même les bonnes pratiques de
# développement logiciel comme la revue de code ou l'intégration
# continue sont encore rarement appliqués au logiciels utilisés dans la
# recherche.
** Une dimension culturelle et sociale
#+BEGIN_QUOTE
\centering Article = version _simplifiée_ de la procédure
#+END_QUOTE
#+LaTeX: \bigskip
#+BEGIN_QUOTE
\centering
*Tracer* toutes ces informations et les *rendre disponibles* =
investissement conséquent
#+END_QUOTE
#+LaTeX: \bigskip
Si personne n'exige/n'inspecte ces informations, à quoi bon
s'embêter ?
# Note:
# Enfin, il serait naïf de ne pas évoquer la dimension culturelle et
# sociale du problème.
# Un article est une version simplifiée et intelligible des
# résultats. Certains diraient même la publicité... Une description de
# haut niveau est essentielle car elle permet de prendre du recul mais
# elle est devenue la norme alors que la technicité de la recherche
# actuelle est telle qu'il est clairement impossible de donner dans un
# document de 8 à 10 pages toutes les informations permettant de refaire
# les expériences et les analyses.
# - La description du protocole expérimental est souvent succincte
# - Les données sont généralement bien trop nombreuses pour être données
# in extenso et sont résumées à travers quelques courbes.
# - Les traitements statistiques appliqués pour parvenir à ces courbes
# ne sont décrits que rapidement.
# Alors, bien sûr il est possible de tracer toutes ces informations et
# de les mettre à disposition. À ceci près que cela demande du temps,
# voire beaucoup de temps si on ne dispose pas des bons outils.
# # - sans compter que mettre à disposition toutes ces informations, alors
# # qu'on a soi-même peiné à les obtenir, c'est permettre à d'autres de
# # récupérer les fruits de notre travail sans efforts.
# Mais si personne n'exige ces informations, à quoi bon s'embêter ?
** Tout rendre public ?
#+LaTeX: \def\a{\`a }
- Les /faiblesses/ deviendraient évidentes
- Quelqu'un pourrait trouver une /erreur/
- Quelqu'un pourrait en [[http://www.nature.com/news/the-top-100-papers-1.16224][tirer avantage \a ma place]]
- /Les données peuvent être sensibles/
# sécurité, machine learning pour la police
Donnons nous les moyens que tout soit inspectable à la demande
# Note:
# Mais donner accès, mettre à disposition, cela veut dire tout rendre
# public ? N'est-ce pas un peu radical ? Et risqué ? Démontons ensemble
# quelques idées reçues.
# Si je donne accès à tout ce que j'ai fait, il deviendra alors évident
# que ce que j'ai fait n'est pas aussi parfait que ce que je prétends,
# que c'est un peu sale et pas toujours très rigoureux, que j'ai
# sélectionné les résultats que je présente.
# - C'est sûr. En même temps, c'est la réalité et vous auriez tort de
# croire que vous êtes le seul dans cette situation. Si ça se trouve,
# vous travaillez mieux que les autres et dans un domaine où la
# réputation est essentielle, vous avez probablement plutôt intérêt à
# le montrer. Pire, si vous le cachez, cela finira par paraître
# suspicieux.
# Vous me direz qu'en révélant tout, je prend le risque que quelqu'un
# trouve une erreur et de passer pour un imbécile.
# - C'est certain, mais tout le monde fait des erreurs, même les plus
# grands. Et en ce qui me concerne, je préfère que quelqu'un trouve
# une erreur et m'aide à la corriger afin que mes travaux deviennent
# corrects.
# Oui, mais quelqu'un pourrait tirer parti, réanalyser ces données que
# j'ai eu tant de mal à obtenir, ou simplement utiliser ce code que j'ai
# eu tant de mal à écrire et faire trois ou quatre papiers là où je n'ai
# eu le temps d'en faire qu'un.
# - Alors d'abord, si quelqu'un réutilise votre travail, il se doit de
# le citer correctement et de vous rendre le crédit qui vous est
# dû. Ensuite les articles les plus cités de tous les temps sont des
# articles présentant des contributions méthodologiques ou du logiciel
# qui sont devenus essentiels dans un domaine.
# Une petite parenthèse : ceux d'entre vous qui connaissent github,
# savent que cette plate-forme est à mi-chemin entre la plate-forme de
# développement logiciel et le réseau social. Les contributions d'un
# développeur à différents projets sont visibles ainsi que la
# fréquence de ses contributions, ce qui permet à un jeune développeur
# de se faire une carte de visite infalsifiable et
# ultra-visible. Montrer ce que l'on fait est une façon efficace
# d'atteindre une certaine forme de reconnaissance par la
# communauté. Mettre ses travaux à disposition de tous est
# probablement la meilleure façon de démontrer sa propriété
# intellectuelle.
# Enfin, il est possible que les données soient sensibles et ne puissent
# être divulguées sans prendre le risque de causer du tort à des
# gens. Par exemple, s'il s'agit de données médicales, de données
# judiciaires, d'informations sur des enfants ou sur des intentions de
# vote, etc.
# - Dans ce type de situation où les travaux ont une dimension éthique,
# il convient de définir quelles personnes peuvent avoir accès aux
# informations pour les vérifier ou les réutiliser. Ensuite, il existe
# des techniques cryptographiques assez faciles d'accès permettant de
# s'assurer que seulement les personnes habilitées peuvent accéder aux
# données.
# Dans tous les cas, même si au final ces informations sont
# semi-publiques, il est essentiel de se donner les moyens de permettre
# à autrui d'inspecter ce que nous avons fait.
** Outils à éviter et alternatives
- *Outils, formats, et services propriétaires*
1. +Excel, Word, Evernote+
- Markdown, Org-mode, CSV, HDF5, ...
2. +SAS, Minitab, matlab, mathematica, ...+
- Scilab, R, Python, ...
3. +Dropbox, cahiers de labo en ligne propriétaires, ...+
- Framadrop, GitLab/GitHub, ...
- *Outils "intuitifs" *
- +tableurs, interfaces graphiques, exploration interactive+
- apprendre à se contrôler... $\smiley$
- R, Python, ...
# Note:
# Et pour permettre l'inspection, il faut utiliser les bons outils
# Cela commence par banir autant que possible les logiciels et les
# formats propriétaires. Bien sûr, ces outils sont bien faits et vous y
# êtes habitués mais on en est également captif et les entreprises qui
# les développement n'offrent aucune garantie sur le long terme. Je suis
# sûr que ces mises à jours automatiques vous agacent vous aussi. :)
# L'expérience montre qu'il est hélas très courant de perdre des données
# et des informations lors de ces mises à jour.
# Alors, soyons honnête, l'utilisation de logiciel libre ne vous protège
# absolument pas de ce genre de mauvaises surprises. Mais comme vous
# avez accès librement à l'ensemble des versions, les chances d'arriver
# à récupérer vos données sont quand même bien plus élevées. De même
# l'adoption de formats textes simples et ouverts augmente vos chances
# d'arriver à les relire avec d'autres logiciels.
# En ce qui me concerne, à chaque fois que j'ai utilisé un format
# binaire ou pas bien ouvert, j'ai fini par perdre des données. Cela
# fait donc 10 ans que je n'utilise plus que des formats texte ou des
# standards binaires ouverts et le problème ne s'est plus jamais posé,
# et ce malgré les mises à jours logicielles très régulières de ma
# machine.
# Donc règle numéro 1 : utiliser autant que possible du format texte
# (markdown, orgmode pour vos notes, csv pour vos données).
# Règle numéro 2 : utiliser autant que possible les logiciels et les
# langages de programmation libres comme R ou python.
# Et Règle numéro 3 : éviter de stocker vos données chez un hébergeur
# dont vous pourriez être captif.
# En effet, les services gratuits (ou pas) et très intégrés sont
# tentants mais correspondent à un business plan particulier qui peut se
# révéler incompatible avec vos besoins futurs, ne pas être pérenne et
# ne vous donne pas forcément les garanties de confidentialité que vous
# souhaiteriez.
# Enfin, attention aux tableurs et outils graphiques qui peuvent vous
# donner au premier abord l'impression d'une meilleur efficacité et
# productivité mais qui sur le long terme ne vous permettent pas
# d'atteindre la traçabilité et l'inspectabilité que vous souhaiteriez.
# C'est plus difficile, en particulier au début, mais en utilisant des
# langages comme R ou python, passé la première marche, on gagne
# rapidement en puissance et en efficacité.
** Conséquences :noexport:
- Des *erreurs*...
- Des *difficultés* certaines à *réutiliser* le travail des autres, voire
son propre travail
- Un *doute* dommageable pour tout le monde (auteur, détracteurs,
lecteur, décideur...)
# Note:
# C'est pour toutes ces raisons que les résultats de recherche
# contiennent parfois des erreurs et sont si difficile à répliquer et à
# réutiliser, même au sein d'une même équipe.
# Les doutes que cela engendre sont dommageable pour tout le
# monde. Lorsque l'on propose un résultat, il n'est pas agréable d'être
# soupçonné de fraude ou d'incompétence. En même temps, les détracteurs
# d'un résultat apparaissent comme de simples aigris ou au contraire
# comme des lanceurs d'alertes selon le contexte alors qu'il est normal
# de questionner un résultat et d'avoir un débat apaisé et rationnel à
# son sujet.
# Face à ces problèmes, il me semble que la meilleur attitude à avoir
# est celle de la transparence : Expliciter augmente les chances de
# trouver les erreurs et de les éliminer.
# C'est d'ailleurs une demande de plus en plus pressante de la part
# de la société civile afin d'éviter les dérives et d'améliorer
# l'efficacité de nos travaux.
** Changement de paradigme
1. Manque d'information, problème d'accès aux données
2. Erreurs de calcul
3. Manque de rigueur scientifique et technique
#+LaTeX: \begin{center}\includegraphics[height=2.5cm]{img/in_science_we_trust_small.jpg}
#+LaTeX: \includegraphics[height=2.5cm]{img/in_code_we_trust.jpg}\end{center}
*** Expliciter augmente les chances de trouver les erreurs et de les éliminer
# Demande de *traçabilité* de plus en plus pressante de la société, des
# institutions, de l'Europe, ...
# Note:
# Nous avons vu que la première cause d'échec de reproduction de
# résultats scientifiques est tout simplement le manque d'information,
# la non disponibilité des données ou des procédures appliquées. Cela ne
# signifie pas que le résultat soit faux mais cela empêche de le
# vérifier et de s'appuyer dessus.
# La seconde cause d'échec est tout simplement l'erreur de calcul qui
# peut se glisser n'importe où.
# De manière générale, le manque de rigueur scientifique et technique
# est souvent à l'origine de ces deux problèmes.
# Il me semble que la meilleur attitude à avoir est celle de la
# transparence : Expliciter augmente les chances de trouver les erreurs
# et de les éliminer. C'est pour cela que nous assistons ces dernières
# années à un changement de paradigme de recherche et que l'on exige un
# accès à l'ensemble des données et des procédures de calcul.
# C'est d'ailleurs une demande de plus en plus pressante de la part de
# la société civile (en particulier le Conseil Européen) afin d'éviter
# les dérives et d'améliorer l'efficacité de nos travaux.
* M2-S3: Le document computationnel : principe
** Le document computationnel
1. Exemples récents d'études assez discutées
2. Pourquoi est-ce difficile ?
3. *Le document computationnel : principe*
4. Prise en main de l'outil. Au choix :
- Jupyter
- Rstudio
- Org-Mode
5. Travailler avec les autres
6. Analyse comparée des différents outils
** Le document computationnel : principe
file:img/iceberg.jpg
# Note:
# Dans cette séquence, je vais vous présenter ce qu'est un document
# computationnel ainsi que les principes généraux que nous retrouverons
# dans chacun des trois environnements dont je vous ai précédemment
# parlé. L'intérêt de ce type de document est de permettre une
# transparence la plus complète possible.
** La science moderne
#+LaTeX: \includegraphics<1>[width=\linewidth]{img/iceberg_publication-1.png}%
#+LaTeX: \includegraphics<2>[width=\linewidth]{img/iceberg_publication-2.png}%
#+LaTeX: \includegraphics<3>[width=\linewidth]{img/iceberg_publication-3.png}%
#+LaTeX: \includegraphics<4>[width=\linewidth]{img/iceberg_publication-4.png}%
#+LaTeX: \includegraphics<5>[width=\linewidth]{img/iceberg_publication-5.png}%
# Note:
# # Data \to visualization/analysis \to article
# Si une partie de l'activité scientifique nécessite des mesures sur le
# terrain ou derrière une paillasse, la majeure partie se passe
# maintenant derrière un ordinateur, les données provenant de machines
# spécifiques : je pense par exemple à un accélérateur de particules, des
# séquenceurs d'ADN, un téléscope, un réseau de capteur ou bien sûr des
# simulations numériques s'exécutant sur des supercalculateurs.
# Une fois ces données obtenues, elles sont transformées pour être
# analysées, visualisées afin de mieux en comprendre la structure. Il
# est courant de partager ces visualisations avec des collègues,
# d'avoir un certain nombre d'itérations, de passer d'une vue à une
# autre jusqu'à trouver celle qui explique le mieux les choses. On
# utilise d'ailleurs souvent une multitude de logiciels spécifiques pour
# obtenir ces visualisations.
# Il arrive souvent qu'on soit déçu par les résultats, qu'on n'y
# comprenne rien ou qu'on se rende compte que les données ne sont pas
# intéressantes et qu'il faut se poser la poser la question sous un
# angle différent.
# Dans ce cas, retour à la case départ : acquisition de
# données, visualisations, statistiques, nombreux échanges avec les
# collègues...
# Puis ça y est, on trouve enfin quelque chose d'intéressant. On prend
# alors nos plus belles figures, on y ajoute les explications qui sont
# finalement les bonnes, on tente de rendre tout cela intéressant et on
# envoie l'ensemble à une conférence ou un journal.
# Hélas, dans un pdf de 8 pages, le lecteur trouvera une jolie histoire,
# des figures convaincantes mais n'aura aucune idée du réel travail
# effectué. L'article, c'est la partie émergée de l'iceberg et il n'y a
# alors plus aucun moyen de revenir sur les nombreuses tentatives et
# échecs, ni sur les calculs et les données derrière chacune de ces
# figures.
# La recherche reproductible, c'est permettre de pouvoir naviguer dans
# les deux sens et de combler le fossé séparant l'auteur du lecteur.
** Objectifs méthodologiques
Garder trace afin de :
- *Inspecter* : justifier/comprendre
- *Refaire* : vérifier/corriger/réutiliser
# Note:
# Notre objectif est donc d'avoir un outil nous permettant :
# - d'une part d'inspecter toute cette démarche, afin que l'auteur
# puisse justifier pourquoi tel ou tel code est utilisé et que le
# lecteur puisse comprendre ce qui a été fait;
# - et d'autre part de refaire le calcul et l'analyse le plus
# simplement possible, ce qui est essentiel
# 1. pour permettre aux lecteurs de vérifier que ces calculs sont
# corrects,
# 2. pour permettre éventuellement de corriger des erreurs s'il y en a
# 3. et enfin pour permettre à d'autres de réutiliser ces travaux, soit
# sur un jeu de données différent, soit en réutilisant une partie de
# la procédure d'analyse dans un autre contexte.
** La vitrine... et l'envers du décor
\scriptsize
#+LaTeX: \only<1>{\hfill\includesvg[width=.5\linewidth]{img/example_pi_full-1}}%
#+LaTeX: \only<2>{\includesvg[width=\linewidth]{img/example_pi_full-2}}%
#+LaTeX: \only<3>{\includesvg[width=\linewidth]{img/example_pi_full-3}}%
#+LaTeX: \only<4>{\includesvg[width=\linewidth]{img/example_pi_full-4}}%
#+LaTeX: \only<5>{\includesvg[width=\linewidth]{img/example_pi_full-5}}%
#+LaTeX: \only<6>{\includesvg[width=\linewidth]{img/example_pi_full-6}}%
# #+LaTeX: \includesvg<1>[width=\linewidth]{img/example_pi_full-2.svg}%
# #+LaTeX: \includesvg<1>[width=\linewidth]{img/example_pi_full-3.svg}%
# #+LaTeX: \includesvg<1>[width=\linewidth]{img/example_pi_full-4.svg}%
# #+LaTeX: \includesvg<1>[width=\linewidth]{img/example_pi_full-5.svg}%
# #+LaTeX: \includesvg<1>[width=\linewidth]{img/example_pi_full-6.svg}%
# Note:
# Voici la partie émergée du document computationnel. Au premier abord,
# il s'agit d'un document tout à fait banal avec un titre, du texte,
# éventuellement un petit morceau de code illustrant une procédure de
# calcul, des résultats numériques, des formules de maths, des figures,
# etc. Bref, un article classique au format pdf ou html.
# Voici maintenant ce qui se cache derrière ce document : ici, un
# notebook Jupyter tel que nous pouvons le voir dans un navigateur
# web. C'est un document dynamique constitué de différentes parties sur
# lesquelles on peut interagir.
# Tout d'abord du texte au format markdown : ce sont les zones de texte
# que j'ai surlignées en orange. Le formattage est assez simple, on peut
# assez facilement y inclure des liens hypertextes ou des formules
# mathématiques.
# Entre ces zones de texte, on trouve des zones de code, que j'ai
# surlignées en bleu. Ici il s'agit de fragments de code python
# relativement simples. Dans cet environnement, il est possible d'éditer
# directement ces fragments de code et les exécuter. En fait, un
# notebook a en interne une console python ouverte et lorsque l'on
# demande l'exécution d'un fragment de code, le code est directement
# envoyé dans la console et le résultat est automatiquement récupéré.
# Le résultat de chacun de ces différents codes est stocké juste en
# dessous dans les zones que j'ai surlignées en jaune. Puisque cette
# console reste "vivante" tout au long du document, les résultats
# calculés dans un bloc sont visibles dans le bloc suivant, ce qui
# encourage à ne pas écrire de longs blocs de code infâmes, mais au
# contraire à écrire de petits fragments, à calculer les choses petit à
# petit, tout en expliquant dans les zones de texte (en orange) comment
# les différents fragments de code (en bleu) s'enchaînent et éventuellement
# pourquoi, en fonction de ce que l'on vient de calculer (en jaune), on
# décide d'appliquer tel nouveau fragment.
# Une fois satisfait avec les calculs, on aime en général bien créer un
# document classique en exportant vers du pdf ou du html. Chaque zone
# (texte, code, résultat) est convertie et assemblée en un seul document
# markdown qui est à son tour transformé vers le format désiré avec un
# outil comme pandoc.
# Bien sûr, dans le document final, on ne souhaite pas forcément rendre
# tous les fragments de codes et tous les résultats visibles. C'est la
# raison pour laquelle pour chacune de ces zones, il est possible de
# spécifier si l'on souhaite la cacher ou pas.
# Enfin, si les résultats intermédiaires sont stockés automatiquement
# dans le notebook, l'environnement permet de ré-exécuter très
# simplement l'ensemble du code du notebook et de mettre à jour les
# résultats.
# C'est donc à vous de décider, selon le contexte, si vous souhaitez
# partager le document final, qui est souvent plus compact, ou le document
# computationnel qui va permettre une inspection complète et une
# réutilisation.
** Les différents outils
1. Jupyter
2. Rstudio/knitR
3. Org mode
| *Principes identiques* | *Différences* |
|----------------------------------------+--------------------|
| • *1 seul document* | • Syntaxe |
| \qquad (explications, code, resultats) | |
| • Session | • Interopérabilité |
| • Export | • Contrôle export |
# Note:
# Les trois environnements les plus matures permettant de créer de tels
# documents sont Jupyter, que vous venez de voir, Rstudio/knitr, et
# Org-mode. Ces trois environnements se distinguent par le niveau de
# technicité nécessaire à leur mise en oeuvre. Je ferai une petite démo
# de chacun de ces trois environnements dans les séquences suivantes. À
# l'issue de ces démonstrations, vous pourrez choisir lequel vous
# convient le mieux.
# Vous verrez que le principe reste le même dans les trois environnements :
# - Tout d'abord, avoir un seul document comprenant un entrelacs
# d'explications au format markdown, de code exécutable simplement, et
# les résultats de ces exécutions.
# Cette organisation permet l'inspection et la réexécution que nous
# nous étions fixés comme objectifs.
# - En interne, une console python ou R est active et assure une
# persistance des variables d'un fragment de code à l'autre. C'est la
# notion de session sur laquelle nous reviendrons pendant les
# démonstrations.
# - Enfin, il est possible d'exporter le document computationnel vers un
# format plus traditionnel éventuellement en masquant certaines
# parties.
# Les différences entre ces différents environnements sont relativement
# mineures :
# - Il y a quelques différences de syntaxe. Jupyter et Rstudio utilisent
# du markdown alors que Org mode utilise le format org qui est
# légèrement différent mais tout aussi lisible. La
# façon d'indiquer les zones de code et les résultats est également un
# peu différente mais c'est sans grande importance une fois dans
# l'environnement correspondant.
# - Plus important, peut-être l'interopérabilité entre différents
# langages. Jupyter vous permet de faire du python, du R, du ruby ou
# bien du julia mais pas vraiment d'utiliser plusieurs langages dans
# un même notebook. /Enfin/, c'est possible mais ça demande un peu de
# travail.
# Rstudio est conçu spécifiquement autour du langage R. Même s'il est
# possible d'utiliser du code python, vous verrez que ça n'est pas
# aussi convivial que pour R.
# Enfin, Org-mode permet une interaction entre les différents langages
# relativement naturelle mais comme je le disais, la courbe
# d'apprentissage est un peu plus raide.
# - Enfin, ces outils diffèrent par le contrôle offert en terme de mise
# en page lors de l'export. Jupyter et Rstudio se reposent sur
# markdown et donc sur pandoc. Le style par défaut est très bien,
# surtout si on souhaite produire du HTML. Mais si on doit produire un
# document PDF respectant un style particulier, ça peut être peu
# compliqué de demander à pandoc d'appliquer ce style.
# Org-mode ne fait à peu près rien pour vous de ce point de vue là. Il
# vous faudra donc de toutes façons configurer le style de votre
# export. Ceci dit, un des points que j'apprécie particulièrement
# lorsque je prépare un article en latex avec org-mode, c'est la
# capacité à écrire directement du LaTeX qui sera passé tel quel lors
# de l'export, ce qui me permet de faire exactement ce que je
# souhaite.
# Bien. Vous savez tout. Alors maintenant, Démo !
* M2-S4A: Prise en main de l'outil (Jupyter)
** Le document computationnel
1. Exemples récents d'études assez discutées
2. Pourquoi est-ce difficile ?
3. Le document computationnel : principe
4. *Prise en main de l'outil*. Au choix :
- *Jupyter*
- Rstudio
- Org-Mode
5. Travailler avec les autres
6. Analyse comparée des différents outils
** Prise en main de l'outil : Jupyter
#+ATTR_LATEX: :height 2cm :center nil
file:img/jupyter-logo.png
** Lancement
- Ouverture d'un document
- Description rapide
- Sauvegarde
- Aide
** Exécution des blocs
- Exécution et récupération des résultats
- Ajout d'un bloc
- Attention à l'ordre
- Notion de session
- Incohérences possibles
- Tout réexécuter depuis le début
** Raccourcis clavier, auto-complétion, et Ipython magic
- Raccourcis clavier =<h>=
- Complétion Python (exemple de numpy)
- =%matplotlib=, =%lsmagic=
# =%run=, =%load=, =%load_ext=
** Utiliser d'autres langages
- Exemple pour R :
- =%load_ext rpy2.ipython=
- =%%R %%sh %%perl=
- Interaction entre =R= et =Python= possible
- mais fragile...
** Production et partage du document final
- Résultats stockés dans le document
- $\to$ visibles dans gitlab
- =git pull/push=
- Export HTML/PDF classique
** Préparer un document
# Contrôler la visibilité du code et des résultats
- Hide-code plugin
- =%%latex= et =%%html=
- [[http://nbconvert.readthedocs.io/en/latest/external_exporters.html][Personnaliser les /exporters/ de NBConvert]]
\small\href{-1cm}
~jupyter nbconvert --to mypackage.MyExporter notebook.ipynb~
** Ce qu'il faut retenir
- Beaucoup d'informations en peu de temps
- Mettez en pratique !
* M2-S4B: Prise en main de l'outil (Rstudio)
** Le document computationnel
1. Exemples récents d'études assez discutées
2. Pourquoi est-ce difficile ?
3. Le document computationnel : principe
4. *Prise en main de l'outil*. Au choix :
- Jupyter
- *Rstudio*
- Org-Mode
5. Travailler avec les autres
6. Analyse comparée des différents outils
** Prise en main de l'outil : Rstudio
#+ATTR_LATEX: :height 2cm :center nil
file:img/RStudio-Logo-Blue-Gradient.png
#+ATTR_LATEX: :height 2cm :center nil
file:img//knitr.png
** Lancement
- Ouverture d'un document
- Description rapide
- Sauvegarde
- Aide
** Exécution des blocs
- Exécution et récupération des résultats
- Ajout d'un bloc
- Attention à l'ordre (notion de session, incohérences possibles)
- Tout réexécuter depuis le début
** Raccourcis clavier et auto-complétion
- Raccourcis claviers
- Complétion R
- Folding
** Production et partage du document final
- Knit
- Partage à peu de frais via rpubs
** Contrôler la visibilité du code et des résultats
- Complétion (paramètres des blocs)
** Utiliser un style particulier
- pdf, LaTeX
- html
- word/office
Possibilité de faire du LaTeX (R Sweave : =Rnw=) ou du html (R html :
=Rhtml=) directement pour avoir un contrôle parfait.
** Utiliser d'autres langages
- Ajout et exécution d'un bloc Python
- Attention, pas de session !
- Interaction uniquement via fichiers et dans de longs blocs
** Ce qu'il faut retenir
- Beaucoup d'informations en peu de temps
- Mettez en pratique !
* M2-S4C: Prise en main de l'outil (Org-Mode)
** Le document computationnel
1. Exemples récents d'études assez discutées
2. Pourquoi est-ce difficile ?
3. Le document computationnel : principe
4. *Prise en main de l'outil*. Au choix :
- Jupyter
- Rstudio
- *Org-Mode*
5. Travailler avec les autres
6. Analyse comparée des différents outils
** Prise en main de l'outil : Org Mode
#+ATTR_LATEX: :height 2cm :center nil
file:img/600px-EmacsIcon.svg.png
#+ATTR_LATEX: :height 2cm :center nil
file:img/442px-Org-mode-unicorn.svg.png
# Note:
# Même plan que précédemment
** Lancement
- Ouverture d'un document
- Description rapide
- Folding / Navigation
- Restructuration
- Sauvegarde
- Aide
** Exécution des blocs
- Ajout d'un bloc R
- Exécution et récupération des résultats
- Attention à l'ordre
- Notion de session
- Incohérences possibles
- Tout réexécuter depuis le début
** Raccourcis clavier
- Bloc expansion
- R graphique
- Python, Perl, ...
- Shell session
- Plusieurs sessions, plusieurs langages !
- Communication entre langages possible
** Navigation :noexport:
- Folding
- Restructuration
# - Annotation (tags) ???
# - Sparse Tree ???
** Production et partage du document final
- Git Commit
- Attention aux fichiers produits
- Export
# - Désactiver le recalcul
- Visibilité du code et des résultats
- Sections cachées
** Utiliser un style particulier
- pdf, LaTeX
- html
- Possibilité de reprendre le contrôle
** Ce qu'il faut retenir
- Beaucoup d'informations en peu de temps
- Apprivoiser les raccourcis claviers avec la première entrée du
journal
- Mettez en pratique !
* M2-S5: Travailler avec les autres
** Le document computationnel
1. Exemples récents d'études assez discutées
2. Pourquoi est-ce difficile ?
3. Le document computationnel : principe
4. Prise en main de l'outil. Au choix :
- Jupyter
- Rstudio
- Org-Mode
5. *Travailler avec les autres*
6. Analyse comparée des différents outils
** Travailler avec les autres
file:img/jumping_penguin.png
** Préparer un document pour un journal
Pré-requis pour faire un *pdf* :
- Actuellement caché. En interne /pandoc/, /knitr/ ou /emacs/org-mode/
- /LaTeX/ installé
Export *office/word* possible dans jupyter mais à configurer. Sinon
export *html*...
*** Dans tous les cas :
- Besoin de cacher certaines cellules
- Utiliser le bon style
# Soyons honnêtes
*** Produire un tel document demande d'avoir un environnement parfaitement configuré
# Note:
# Tout ces détails auront été expliqués avant pour chaque environnement.
# - http://blog.juliusschulz.de/blog/ultimate-ipython-notebook
# - https://github.com/kirbs-/hide_code is a must-have
# - http://svmiller.com/blog/2016/02/svm-r-markdown-manuscript/
# - https://github.com/balouf/Kleinberg/blob/master/KleinbergsGridSimulator.ipynb
# - Il y doit y avoir des choses équivalentes, mais plus simples pour
# Rmd
# - Et pour emacs, c'est d'une certaine façon plus simple car on est
# habitué à bidouiller.
** Convaincre vos co-auteurs
Face à cette complexité, plusieurs réactions :
1. Pas grave, c'est génial ! Je m'y mets !
2. Euh... c'est bien. Mais je n'ai pas le temps d'apprendre...
3. Un nouvel outil ? Jamais !
$\leadsto$ différentes organisations possibles
** Option 1 : les co-auteurs enthousiastes
Il faudra *assurer le service après-vente* :
- Compatibilité avec les différents environnements
- Gérer cette complexité (Jupyter/Rstudio/Emacs, Git, ...)
C'est la meilleure façon de *s'assurer que tout est reproductible* et
inspectable (et pas uniquement sur votre propre machine\dots)\hspace{-3em}
** Option 2 : investissement a minima
Vos co-auteurs vous laissent gérer le code, les résultats mais
adoptent votre style de document.
*Ils peuvent :*
- Éditer le texte de l'article (Markdown ou Org-Mode)
*Ils ne peuvent pas :*
- Recalculer
- Exporter et voir le document final
** Option 3 : les co-auteurs "réfractaires"
*Les co-auteurs ne changent pas leurs habitudes*
- Un document /computationnel/ séparé produit tous les résultats et
toutes les figures
- Un autre document (/classique/) inclut les figures générées
Mais tout est *conservé*, *documenté* et *recalculable* dans votre document
computationnel !
** Publier / partager votre document
*Rpubs*
- Parfait pour partage rapide, pas pérenne
*Dropbox et autres*
- +Pérénité+, accès ??, ...
*Gitlab/Github/...*
1. Rendre public (tout l'historique !)
2. Faire le ménage et archiver l'état courant dans un site compagnon
*Sites compagnons*
- Runmycode, Éditeurs, ...
- Article : *HAL* ; code et données : *Figshare / Zenodo*
** Conclusion
Plusieurs modalités possibles en fonction de :
- vos co-auteurs
- vos contraintes techniques
- vos contraintes de confidentialité/copyright
* M2-S6: Analyse comparée des différents outils
** Le document computationnel
1. Exemples récents d'études assez discutées
2. Pourquoi est-ce difficile ?
3. Le document computationnel : principe
4. Prise en main de l'outil. Au choix :
- Jupyter
- Rstudio
- Org-Mode
5. Travailler avec les autres
6. *Analyse comparée des différents outils*
** Analyse comparée des différents outils
#+ATTR_LATEX: :height 2cm :center nil
file:img/jupyter-logo.png
#+ATTR_LATEX: :height 2cm :center nil
file:img/RStudio-Logo-Blue-Gradient.png
#+ATTR_LATEX: :height 2cm :center nil
file:img/442px-Org-mode-unicorn.svg.png
#+ATTR_LATEX: :height 2cm :center nil
file:img/question_mark.png
\bigskip
Un document computationnel,
mais pour quoi faire exactement ?
# Note:
# - Pour comparer ces différents outils, il est important de bien
# identifier l'usage que l'on souhaite en faire.
# - Nous allons regarder ensemble quelques cas d'usages
** Un cours ou un tutoriel
Un notebook Jupyter
- Facile à prendre en main
- Document dynamique
# Note:
# - Super pratique.
# - Téléchargement, exécution dynamique, résultats interactifs,
# variations faciles, etc.
# - C'est idéal pour un document à destination d'auto-formation.
** Un journal
[[file:~/org/journal.org][Mon journal en org-mode]]
- Un seul auteur
- Organisation chronologique
- Étiquettes
- Notes, liens, code
# Note:
# - Structuration type: par date
# - Mots-clés
# - Navigation aisée
# - Réexécution de code comme d'habitude
** Un cahier de laboratoire
[[file:~/Work/Documents/Articles/2018/Alya-Perf/LabBook.org][Un cahier de laboratoire en org-mode]]
- Organisation sémantique
- Conventions
- Plusieurs auteurs
- Étiquettes pour auteurs, expériences, etc.
# Note:
# - Assez proche d'un journal mais avec un contenu bien plus technique
# et fait pour être exploitable par des collègues.
# - Exemple de structuration.
** Un article reproductible
[[file:~/Work/Documents/Articles/2017/paper-hpl-at-scale/paper.org][Un article en cours]]
- Plusieurs auteurs
- Regénérer les figures
- Revenir aux sources
# Note:
# - On voit la structure de l'article.
# - Certaines sections sont cachées
# - Elles pointent vers le cahier de laboratoire traçant les données
# que je vais exploiter.
# - Ici, je suis reparti de figure que Tom avait faites et je les ai
# retravaillées et adaptées à ce dont j'avais besoin pour mon
# article.
# - Ici, c'est un peu "sale", il y a des liens vers des fichiers qui
# sont sur mon disque dur mais c'est un article en cours de
# préparation et vous voyez que j'ai bien accès à l'ensemble des
# informations dont j'ai besoin.
# - Plusieurs structurations sont possibles. En général, j'ai une
# grosse section cachée au début de l'article où j'indique comment
# récupérer l'ensemble des données (avec les commandes git ou les
# URLs). Le reste du code d'analyse contenu dans l'article peut alors
# être exécuté.
# - Ici, comme on prépare un article, il est essentiel de pouvoir cacher
# certaines sections et d'avoir un contrôle complet sur la typographie
# car on n'a jamais assez de place.
# - Dans tous les cas, tout ceci n'est possible que si on a suffisemment
# de matière, c'est-à-dire que si on a pris régulièrement des notes
# sur comment on a obtenu les données et sur comment on les a
# analysées. C'est ce que vous mettrez en pratique dans le module 3
# avec l'outil de votre choix.
** Différences techniques
#+LaTeX: \null\hspace{-1cm}\begin{overlayarea}{\linewidth}{2.4cm}\scalebox{.73}{
#+ATTR_LATEX: :center nil
| | Origine | Technologie | Utilisation | Navigation | Format | Article? |
|---------------+-----------+--------------------+---------------+------------+--------+-----------|
| Jupyter | 2001 | Web App., Python | Facile | Limitée | JSON | Difficile |
| Rstudio/knitr | 2011/2014 | IDE, Java/R | Facile | Limitée | Rmd | Oui |
| Org-Mode | 1976/2008 | Editeur, EmacsLisp | Plus complexe | Puissante | Org | Oui |
#+LaTeX: }\end{overlayarea}
L'outil importe peu, ce qui importe, c'est :
- collecter l'information
- l'organiser et la rendre exploitable
- la rendre disponible
# Note:
# - L'écosystème évolue mais vous pouvez déjà vous en saisir.
** Bonus : expériences vécues :noexport:
- Complétion, introspection donc développement/composition pas si
désagréable comparé à un IDE avancé.
- Objectif atteint. Mois par mois : permet aux collègues d'aider,
d'avancer ensemble, etc. Communication de "problèmes" (données
manquantes par exemple) bien plus simple.
- Un document dynamique et traçable, réexecutable, modifiable,
réutilisable, ... Quand le reviewer 3 demande de refaire la figure 5
en noir et blanc et de changer les légendes. Ou bien de rajouter de
la compléter.
- Au jour le jour : meilleur réutilisation (par exemple entre l'article
et le slide)
Éléments clés lors du choix :
- Simplicité de prise en main vs. vrai éditeur
- Où sont fait les calculs
- Multi-langage
- http://carreau.github.io/posts/23-Cross-Language-Integration.html
- Gestion des langages compilés
- Notions de caches et d'état
Les principaux outils actuels :
- jupyter
- rstudio
- org-mode
Limitations :
- Longs calculs
- Grands documents
- Solutions wysiwyg pour jupyter
Historique/diff un peu compliqué pour jupyter
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="189.38907mm"
height="135.26553mm"
viewBox="0 0 189.38907 135.26553"
version="1.1"
id="svg8"
inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
sodipodi:docname="example_pi_full-1.svg">
<defs
id="defs2">
<marker
inkscape:stockid="Arrow2Mend"
orient="auto"
refY="0"
refX="0"
id="Arrow2Mend"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path5561"
style="fill:#a90000;fill-opacity:1;fill-rule:evenodd;stroke:#a90000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="scale(-0.6)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path5537"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.8,0,0,-0.8,-10,0)"
inkscape:connector-curvature="0" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.6457083"
inkscape:cx="550.27824"
inkscape:cy="287.19908"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="3200"
inkscape:window-height="1671"
inkscape:window-x="0"
inkscape:window-y="55"
inkscape:window-maximized="1">
<inkscape:grid
type="xygrid"
id="grid209"
originx="-0.58174896"
originy="-167.42821" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Calque 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-0.58174896,5.6937543)">
<image
y="0.66666812"
x="96.043747"
id="image5529"
xlink:href="data:image/png;base64,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
uh/Yr62H0cNUbHJyMmxsbGBlZXXf3qOkpAQvvfQSfHx8DKr2xrTrxIkTMDU1hYeHR6PbkZSUhBde
eMGg+tPCwgLHjx9vko1OS1om7of8/HxER0cjLS1N53OtrKywbt26B37r9M6dOz+09+Agau5vvs3m
6NGjMnz4cDExMZHHH39cPvnkE7GwsNA8/r///U8CAgKke/fu0r17d3nxxRfl1q1bmsfDw8PF0dFR
jI2NxdnZWXbt2qX1/cLDw2XYsGFiZmYmzz33nLz++uvi5+enefzAgQMyfvx4MTMzE5VKJREREZrH
bt68KUuWLBFbW1vp2LGjeHt7y9WrV3U+9uOPP4qNjY2IiPz0008yaNAg2bRpk4wbN07MzMxk8uTJ
UlJSonM+dfn6669l5MiRYm5uLjNmzJC4uDhZvHixiIh89dVX4uDgUOP506ZNk1dffbVWu+6mq517
9uyRVatWiYhIYmKiPPnkk2JmZib9+vWT7du36zWfrKwsMTY2FgDSuXNn2bFjR612HDlyRGbNmiVq
tVp69eolP/zwQ612axszXXXU16eurq7SqVMn6dGjh7z88stSUVFR53NNTU1l27Ztmr9LS0ulT58+
8sknn2jtl+o11FVjXf3g6ekpHTt2lG7dusn06dOlsLBQxo0bJ88//3yN506ePFlmz56t1/rz+++/
y/jx46Vr167Su3dv+fjjj7WuP1lZWXLw4EHZv3+//Pzzz7J3717Zu3evJCQkSGpqap2v+eSTTyQg
IKDWeljXenv79m0BIGlpaXXOS1t7ddVaXdX7HDt2TCZMmCC2trYybNgwOXXqlIiI5ObmytixYxv1
GeTp6SkKhULat28v//jHP2q1ITs7WwBIfn6+ZtrGjRtl1KhRerWxoTXr6r/09HSZOHGimJqaSu/e
veWVV16R0tJSvdvSkH6ob3nW573qml9D+6Gx2x1qOs0WOPLy8qRr164yd+5c+e233yQiIkK6dOmi
Gfjy8nIZMmSIPPXUU5KamioHDhwQNzc3mT59uoiInDlzRhQKhWzcuFFSU1MlODhYzMzMpLy8vM73
e+edd6Rbt24SFRUlp0+fFl9fX+nUqZO8/vrrIiKyfft26dGjh2zevFlOnz4t69atE4VCIceOHRMR
kdmzZ8tjjz0m+/btk//+979iY2Oj2ehqe+yNN94QX19fERFZt26dtGnTRsLCwqSyslJOnz4tAOSn
n37SOZ+6PsjNzc0lIiJCzpw5I1OnThVLS0tZvny5iIgsX7681ge9vb29fPfdd7XadTdd7ayyc+dO
MTExkQ8++EDOnGa9K9AAACAASURBVDkjK1askA4dOkhmZqZe8/nuu+/E3t6+3mXknXfeEVNTU/H2
9pbo6Gi5detWjXbrGjN966iyf/9+MTIyko8//lgzPwCSnJxc5/MHDRokb731lubvjz76SPr16yff
ffed1n6pXkNdNVZXWVkpdnZ28swzz0hKSors2bNHlEqlvPbaa6JWq0WpVGoC0a1bt6Rjx46yZ88e
netPSUmJ2NnZyfPPPy+pqanywQcfiEKhkF9++aXOWt977z1p06aNAKj1T6FQyIgRI+p8XUBAgKxZ
s0bzt7b1Vlvg0NZeXbXWFzj8/PyksLBQbt++LRMmTJBJkybVeF5jP4MGDRokkZGRdbZB38BRXxsb
WrO2/isrK5O+ffvKlClT5OTJkxIXFyePPvqorF69Wq+2NKQftC3P+o5N9fk1tB8au92hFho4QkND
pXfv3lJWVqaZtnz5cs3Ax8fHi7m5eY1voykpKdKhQwepqKiQnTt3SocOHSQvL09ERAoKCuS7776T
27dv13qvnJwc6dy5syQkJGimpaamCgCJjY2VkpIS6d27t3z//fc1XtenTx/ZvHmziIg88sgjsmbN
GqmsrBQRkePHj8uFCxd0PjZlyhTNijtt2rQaC255ebkYGxvL/v37dc6nuuvXr4uJiYnEx8fX+BYM
QKKjo0VE5P/9v/8n69evr/EaAHLlypVa7bqbrnZWfZu3s7OTsLAwzbTCwkJp3769JtToms+rr74q
/v7+9S4jzzzzjLi5uWm+aVVvtz5jpk8d1R04cEC+/fbbGt/6AEhWVladz//rX/8qS5cu1WzslUql
xMTE6OyX6n1fV413byjeffddycnJ0UwLDAyUoKAguXbtmrRp00b++9//iojIt99+K1ZWVlJWVqZz
/YmKihKlUlnjfRcsWKDpu+p+/PFHmT59uly9elUOHDggK1euFBERb29vrXuLREQcHBxk69atNUJq
feuttsChrb26aq0vcFTf67RlyxYZNGhQjec19jOoKQJHfW1saM3a+i82NlZMTEw0exlERCIiIjSf
xbra0pB+0LY86zs21efX0H5o7HaHmlazHTR67tw5PPbYYzV+J69+w5lz586hsLAQlpaWMDMzg5mZ
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
FhaGTp06aX3dvn37cOHCBQQFBWHixIkoKipC7969ERcXBxMTk3uaZ3PU2xDt27fHH3/8gW+//Rau
rq7o1asXPvzwQ7z66quIiorC2LFja73m4sWLGDx4MNcgIiLSi8GcFjt27FhYWlpi7ty5OHv2LOLj
47FixQosXLiw1p6Ae2FsbIzCwkIcPXoUV65cwYYNG/DNN98gPT0dhYWF9b4uPz8fCxYsQExMDC5e
vIjvv/8eRUVFcHJy0mueVRcTuztANEW9W7duxc6dO/X+uz6vvvoqXnjhBYwaNQopKSlQq9UIDAxE
VFQUzp8/D29v71qvuXDhAlxdXRv8XkRExMDR7Nq1a4fHHntM8//du3ejsLAQnp6eCAoKQmBgIF55
5ZV7nr+JiQnc3NwAAE8++STmz58PX19feHp64uLFi0hMTER+fj6io6PrnYefnx+WLVuGRYsWoX//
/lizZg02btwIDw8Pveb57LPP4t///jfeeOONWrU3tN7q/QUAoaGhiIiI0Pvv+vTs2RPvv/8+3n//
fezduxfnzp3DypUrcfPmzTqvt3H9+nXcvHkTHh4eDX4vIiJ6OCmEP8RTA4WGhuLEiRPYvHkzO4OI
iBg4qOmJCJydnfHll19iyJAh7BAiItIL76VCDZKQkIAnnniCYYOIiBqEeziIiIjovuMeDiIiImLg
ICIiIgYOIiIiIgYOIiIiYuAgIiIiBg4iIiIiBg4iIiJi4CAiIiJi4CAiIiIGDiIiImLgICIiImLg
ICIiIgYOIiIiYuAgIiIiYuAgIiIiBg4iIiIiBg4iIiJi4CAiIiIGDiIiIiIGDiIiImLgICIiIgYO
IiIiIgYOIiIiYuAgIiIiYuAgIiIiBg4iIiJi4CAiIiJi4CAiIiIGDiIiImLgICIiImLgICIiIgYO
IiIiIgYOIiIiYuAgIiIiBg4iIiIiBg4iIiIyHEYPU7Hdu3eHnZ1do+dz69YtdO7cucX3B+tgLayD
y5Y+Ll++jNzcXG4xiYFDX3Z2djh69Gij55OYmAgvL68W3x+sg7WwDi5b+nB3d+fWkhqNP6kQERER
AwcRERExcBARERExcBAREREDBxERETFwEBERETFwEBEREQNHw7z77rtwdnbGgAED8PTTT+POnTu4
dOkSPDw84ODggICAAJSWlgIASkpKEBAQAJVKBQ8PD6Snp3M0iYiIGDi0y8rKwvvvv4+jR4/it99+
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
GYOwNqtHAAAAAElFTkSuQmCC
"
preserveAspectRatio="none"
height="128.54094"
width="93.927078" />
</g>
</svg>
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This image diff could not be displayed because it is too large. You can view the blob instead.
#+STARTUP: overview indent inlineimages logdrawer
#+TITLE: C028AL-W2
#+AUTHOR: Arnaud Legrand
#+TAGS: noexport(n)
* Test et informations :noexport:
** Images
# - file:assets/img/donald_trump.jpg :: [[https://upload.wikimedia.org/wikipedia/commons/d/d4/Donald_Trump_%252825653047910%2529.jpg][Wikimedia]]
# - file:assets/img/trump_vs_obama_inauguration.png :: Screenshot from the
# [[https://www.nytimes.com/interactive/2017/01/20/us/politics/trump-inauguration-crowd.html][NY Times]]
# - file:assets/img/in_science_we_trust.jpg :: crop from [[http://drrichswier.com/2014/04/23/atheism-evolution-and-secular-humanism-masquerading-as-science-against-the-bible-and-creation/][the blog of a
# conservative]].
# - file:assets/img/les_decodeurs.png :: Montage à partir du site
# http://www.lemonde.fr/les-decodeurs/ le 30 juillet.
Origin of every image used in this series of slides:
- PhD Comics:
- [[file:../assets/img/phd010708.png][phd010708.png]]: http://phdcomics.com/comics/archive.php?comicid=961
c'est du fan art, là ;) je cite phdcomics dans la vidéo donc je
pense qu'on est bon et je doute qu'il vienne nous embêter vu le sujet.
- [[file:../assets/img/in_science_we_trust.jpg][in_science_we_trust.jpg]]: https://www.google.fr/search?client=firefox-b&dcr=0&biw=1450&bih=783&tbm=isch&sa=1&q=in+science+we+trust&oq=in+science+we+trust&gs_l=psy-ab.3..0i13k1j0i30k1l3.2692.5748.0.5946.6.5.0.0.0.0.694.1147.0j3j5-1.4.0....0...1.1.64.psy-ab..2.4.1144...0i7i30k1.0.JVlXKVLc9a4#imgrc=bt5vbb5C4e9fHM
puis http://www.patheos.com/blogs/unreasonablefaith/2012/03/a-better-motto/in-science-we-trust-coin/ normalement
- [[file:../assets/img/Researcher-test.jpg][Researcher-test.jpg]]: https://fr.wikipedia.org/wiki/Imagerie_par_r%C3%A9sonance_magn%C3%A9tique_fonctionnelle#/media/File:Researcher-test.jpg
- [[file:../assets/img/flipping_fiasco.png][flipping_fiasco.png]]: https://people.ligo-wa.caltech.edu/~michael.landry/calibration/S5/getsignright.pdf
- [[file:../assets/img/in_science_we_trust_small.jpg][in_science_we_trust_small.jpg]]: voir file:../assets/img/in_science_we_trust.jpg
-
[[file:../assets/img/box-she-s-told-not-to-open-in-it-the-gods-had-placed-all-the-evils-9vbl9q-clipart.jpg][box-she-s-told-not-to-open-in-it-the-gods-had-placed-all-the-evils-9vbl9q-clipart.jpg]]:
trouvé à la base sur
https://politicsinpinkdotcom.files.wordpress.com/2016/12/box-she-s-told-not-to-open-in-it-the-gods-had-placed-all-the-evils-9vbl9q-clipart.jpg
mais visiblement achetable ici:
http://www.istockphoto.com/fr/vectoriel/femme-laissant-d%C3%A9mons-de-la-poitrine-gm165517954-24325536
*à acheter*.
- [[file:../assets/img/in_code_we_trust.jpg][in_code_we_trust.jpg]]: https://www.google.fr/url?sa=i&rct=j&q=&esrc=s&source=images&cd=&cad=rja&uact=8&ved=0ahUKEwiJ2ZfIi4fXAhUJVxQKHb-xCBoQjRwIBw&url=https%3A%2F%2Fwww.spreadshirt.com%2Fa%2Bprogrammer%2Blife-A14770086&psig=AOvVaw1ZDWatztzt2-ycU-7qy-Gh&ust=1508859944930121
- [[file:../assets/img/iceberg.jpg][iceberg.jpg]]: http://www.jdubuzz.com/files/2016/03/iceberg-principle.jpg
- [[file:../assets/img/iceberg_publication-1.png][iceberg_publication-1.png]] and others alike:
- Crédits Juliana Freire: slides 2 à 5 de http://catt.nyu.edu/sites/default/files/files/Provenance_In_Data_Exploration.pdf
- https://en.wikipedia.org/wiki/Large_Hadron_Collider#/media/File:CERN_LHC.jpg
- https://fr.wikipedia.org/wiki/T%C3%A9lescope#/media/File:Hubble_01.jpg
- https://en.wikipedia.org/wiki/DNA_sequencer#/media/File:DNA-Sequencers_from_Flickr_57080968.jpg
- https://cnet3.cbsistatic.com/img/Ly9WLBFBoWxby2UraBktS1ftx90=/2014/06/10/1bd4587d-63a5-4d1a-b2fe-c6b692daa9bb/plantsensors-1.jpg
- http://www.cerfacs.fr/avbp7x/img/FULLSCREEN/explosion-masri_incite_1Md.png
- https://fr.wikipedia.org/wiki/Treemap#/media/File:Carte-proportionnelle-france.png
- https://fr.wikipedia.org/wiki/Repr%C3%A9sentation_graphique_de_donn%C3%A9es_statistiques
- https://fr.wikipedia.org/wiki/Visualisation_d%27informations#/media/File:InteractionAandB.png
- [[file:../assets/img/RStudio-Logo-Blue-Gradient.png and file:../assets/img//knitr.png][RStudio-Logo-Blue-Gradient.png and file:../assets/img//knitr.png]]: https://www.rstudio.com/about/logos/
- [[file:../assets/img/jumping_penguin.png][jumping_penguin.png]]: http://www.istockphoto.com/be/photo/saut-penguins-de-papou-sur-iceberg-gm466554153-33737494
*à acheter*.
* Internal refs/notes :noexport:
** phdcomics
- version control : http://phdcomics.com/comics/archive.php?comicid=1531
- http://r-bio.github.io/intro-git-rstudio/
- https://xkcd.com/1597/
- http://phdcomics.com/comics/archive.php?comicid=961
** Pandoc
- https://enacit1.epfl.ch/markdown-pandoc/
- https://www.markdowntutorial.com/
** Jupyter
*** Install
#+begin_src sh :results output :exports both
sudo apt-get install jupyter-notebook
sudo apt-get install python3-pip
sudo apt-get install python3-matplotlib python3-numpy
#+end_src
Then following https://github.com/kirbs-/hide_code (note sure this is
as useful as I thought though :()
#+begin_src sh :results output :exports both
sudo pip3 install hide_code
sudo jupyter-nbextension install --py hide_code
jupyter-nbextension enable --py hide_code
jupyter-serverextension enable --py hide_code
#+end_src
Pour que l'export via latex fonctionne:
#+begin_src shell :results output :exports both
sudo apt-get install wkhtmltopdf
sudo apt-get install texlive-xetex
#+end_src
Pour avoir R:
#+begin_src shell :results output :exports both
sudo apt-get python3-rpy2
#+end_src
Pour avoir le [[https://github.com/brospars/nb-git][git push/pull dans les notebooks]]:
#+begin_src shell :results output :exports both
jupyter nbextension install https://raw.githubusercontent.com/brospars/nb-git/master/nb-git.js
jupyter nbextension enable nb-git
#+end_src
Autres extensions (code-folding): https://stackoverflow.com/questions/33159518/collapse-cell-in-jupyter-notebook
#+begin_src shell :results output :exports both
pip3 install jupyter_contrib_nbextensions
# jupyter contrib nbextension install --user # not done yet
#+end_src
https://stackoverflow.com/questions/33159518/collapse-cell-in-jupyter-notebook
(collapsible headings)
Pour avoir le kernel R (from https://irkernel.github.io/installation/):
#+begin_src R :results output graphics :file (org-babel-temp-file "figure" ".png") :exports both :width 600 :height 400 :session *R*
install.packages(c('repr', 'IRdisplay', 'evaluate', 'crayon', 'pbdZMQ', 'devtools', 'uuid', 'digest'))
devtools::install_github('IRkernel/IRkernel')
# Don’t forget step 2/2!
IRkernel::installspec()
#+end_src
*** Export
http://markus-beuckelmann.de/blog/customizing-nbconvert-pdf.html
https://nbconvert.readthedocs.io/en/latest/
#+begin_src sh :results output :exports both
ipython3 nbconvert --to pdf Untitled.ipynb
#+end_src
*** Pour aller plus loin
- https://www.dataquest.io/blog/jupyter-notebook-tips-tricks-shortcuts/
* C028AL-W2-S0 (\approx 4:00); Le document computationnel
** Le document computationnel
*La vitrine et l'envers du décor*
#+BEGIN_EXPORT html
<img src="assets/img/phd010708.png" style="height:400px"/>
#+END_EXPORT
Note:
Bonjour à tous,
Si comme moi et que vous êtes assez mal organisés, cette petite bande
dessinée doit vous parler. Nous l'avons intitulée la vitrine et
l'envers du décors mais nous aurions aussi bien pu la baptiser "La
Théorie et la Pratique".
L'apparence que nous donnons en tant qu'expert de notre domaine, en
particulier lorsque nous communiquons avec des collègues, c'est
d'avoir une organisation impeccable, garante de la qualité de nos
travaux. Mais en pratique, nous sommes souvient bien moins organisés
que ce que aimerions être.
Si vous êtes comme moi, vous avez probablement eu envie de faire en
sorte que cela change.
Dans ce module, nous allons voir ensemble ce qu'est un document
computationnel et comment en réaliser un. C'est un terme un peu
barbare mais il nous a semblé que c'était celui qui décrivait le mieux
ce type de document qui permet d'améliorer la traçabilité d'un calcul.
** Module 2. La vitrine et l'envers du décor : le document computationnel
1. <!-- .element class="fragment highlight-current-red" --> Exemples récents d'études assez discutées
2. <!-- .element class="fragment highlight-current-red" --> Pourquoi est-ce difficile ?
3. <!-- .element class="fragment highlight-current-red" --> Le document computationnel : principe
4. <!-- .element class="fragment highlight-current-red" --> Prise en main de l'outil <br/> Au choix :
- <!-- .element class="fragment highlight-current-blue" --> <!-- .element style="font-size:30px" --> Jupyter
- <!-- .element class="fragment highlight-current-blue" --> <!-- .element style="font-size:30px" --> Rstudio
- <!-- .element class="fragment highlight-current-blue" --> <!-- .element style="font-size:30px" --> OrgMode
5. <!-- .element class="fragment highlight-current-red" --> Travailler avec les autres
6. <!-- .element class="fragment highlight-current-red" --> Analyse comparée des différents outils
Note:
Pour vous convaincre de l'importance de cette traçabilité, je vais
commencer par vous présenter quelques exemples récents de travaux dont
les résultats ont été particulièrement controversés et discutés. Ils
illustrent à quel point la capacité à pouvoir inspecter les méthodes
utilisées pour produire tel ou tel résultat est essentielle.
Comme nous le verrons, la plupart des problèmes rencontrés sont liées
au calcul, qu'il s'agisse d'erreurs de programmations, de
transformations de données peu rigoureuses, ou bien de procédures
statistiques discutables.
Une fois les origines de tous ces problèmes identifiées, je vous
présenterai rapidement quelles bonnes pratiques mettre en oeuvre afin
de les éviter.
En particulier, je vous expliquerai ce que c'est que ce fameux
document computationnel: un document qui permet de présenter
agréablement des résultats à d'autres (ce que j'appelle la vitrine)
mais aussi d'accéder à l'ensemble des calculs sous-jacents (ce que
j'appelle l'envers du décor).
Il existe plusieurs formats de tels documents et nous vous proposons
trois environnements permettant d'en produire facilement. Ces trois
environnements se distinguent par le niveau de technicité nécessaire à
leur mise en oeuvre. À vous de choisir celui qui vous convient le
mieux quitte à en essayer un autre plus tard.
Jupyter, le premier, a été intégré au MOOC et au gitlab et ne
nécessite donc aucune installation de votre part. C'est donc le plus
simple à mettre en oeuvre. L'ensemble des données et des calculs sera
hébergé sur nos serveurs, mais vous pourrez y accéder et les récupérer
sur votre propre ordinateur à tout moment via le gitlab si vous le
souhaitez. Jupyter vous permettra de gérer des notebooks et d'utiliser
le langage python3 ou bien le langage R.
Rstudio, le second, est un environnement de développement spécifique
au langage R. Il vous faudra l'installer sur votre machine et
synchroniser vos productions avec le gitlab. C'est un logiciel très
bien maintenu, qui fonctionne aussi bien sous linux et mac que sous
windows et son installation ne devrait pas poser de difficulté
particulière. Si vous êtes déjà familier avec le langage R, c'est
l'option que je vous recommande. L'avantage de cette approche est que
vous aurez à la fin du MOOC sur votre machine un environnement de
travail directement prêt à l'emploi. Avec Rstudio, il est également
possible d'utiliser occasionnellement du code python mais si vous avez
l'intention de faire principalement du python, il vaut mieux utiliser
jupyter.
Enfin, OrgMode, est clairement celui qui est le plus délicat à mettre
en oeuvre mais c'est aussi celui que Konrad, Christophe et moi-même
utilisons quotidiennement aussi bien pour gérer notre cahier de
laboratoire que pour rédiger des articles ou des notes
techniques. Nous nous sommes donc dit qu'il pouvait être intéressant
de vous le présenter. OrgMode nécessite l'installation d'Emacs, un
éditeur de texte qui révèle toute sa puissance dans un environnement
linux ou mac. Il permet de combiner très efficacement différents
langages et est par certains aspects moins limité que les deux
précédents. Cette option est à réserver à un public averti mais le jeu
en vaut la chandelle.
Une fois familiarisé avec un de ces environnements, nous vous
proposerons une petite séance pratique dont l'objectif sera de
produire un petit document computationnel.
Les dernières séquences peuvent être visionnées indépendemment et
traitent de sujets un peu plus techniques, en particulier de comment
utiliser de tels outils avec vos co-auteurs qui peuvent avoir leurs
propres habitudes, ou de comment produire des documents avec un style
bien spécifique.
Nous concluons enfin ce module avec une comparaison de ces différents
outils et une présentation des bénéfices d'une utilisation
quotidienne.
* C028AL-W2-S1 (\approx 7:30); Exemples récents d'études assez discutées
** Le document computationnel
_Module 2. La vitrine et l'envers du décor : le document computationnel_
1. *Exemples récents d'études assez discutées*
2. Pourquoi est-ce difficile ?
3. Le document computationnel : principe
4. Prise en main de l'outil <br/> Au choix :
- Jupyter
- Rstudio
- OrgMode
5. Travailler avec les autres
6. Analyse comparée des différents outils
** Exemples récents d'études assez discutées file:assets/img/in_science_we_trust.jpg&size=cover
Note:
Je vous avais promis quelques exemples récents de travaux dont les
résultats ont été particulièrement controversés et discutés. C'est ce
que je vais vous présenter dans cette séquence.
** Économie : politiques d'austérité (1/2)
*** 2010
# - /gross debt [..] exceeding 90 percent of the economy has a
# significant negative effect on economic growth/
#+BEGIN_QUOTE
Lorsque la dette extérieure brute atteint 60 pourcents du PIB, la
croissance annuelle d'un pays diminue de deux pourcents.
[..] pour des niveaux de dette extérieure dépassant 90 pourcents du
PIB, la croissance annuelle est à peu près divisée par deux.
-- [[https://en.wikipedia.org/wiki/Growth_in_a_Time_of_Debt][Reinhart et Rogoff]]: /Growth in a Time of Debt/
#+END_QUOTE
# - données non publiées mais disponibles sur demande
Note:
Commençons par des travaux en économie. 2007: crise des subprimes aux
États-Unis. De 2008 à 2009, deux économistes prestigieux, Carmen
Reinhart et Kenneth Rogoff présentent leurs travaux et annoncent que
la crise financière est loin d'avoir produite toutes ses
conséquences. En 2010, ils publient un article intitulé "Growth in a
Time of debt" qui étudie le lien entre dette et croissance.
Leurs principales conclusions sont que lorsque lorsque la dette
extérieure d'un pays dépasse 90% du PIB, les conséquences sur la
croissance sont dramatiques.
De nombreux politiciens, journalistes et activistes s'appuient sur cet
article pour soutenir la mise en place de politiques d'austérité
budgétaire.
** Économie : politiques d'austérité (2/2)
*** 2013
# - Herndon, Ash and Pollin: /While using RR's working spreadsheet, we
# identified *coding errors*, *selective exclusion* of/ /available data,
# and *unconventional* weighting of summary *statistics*./
#+BEGIN_QUOTE
<span style="font-size:30px">
En utilisant leurs feuilles excel,
nous avons identifié des *erreurs de programmations*, des *exclusions*
de certaines données, et des pondérations *statistiques non
conventionnelles*.</span>
<center><span style="font-size:30px">
-- Herndon, Ash et Pollin</span></center>
#+END_QUOTE
# #+BEGIN_EXPORT html
# <br/>
# #+END_EXPORT
# - Wray: /combining data across centuries, exchange rate regimes,
# public and private/ /debt, and debt denominated in foreign currency
# as well as domestic currency/
#+BEGIN_QUOTE
<!-- .element class="fragment" data-fragment-index="1"--> <span style="font-size:30px">
R&R combinent des données de siècles
différents, des régimes de changes différents, des dettes privées et
publiques, et des dettes exprimées en monnaies étrangères et
nationales.</span>
<center><!-- .element class="fragment" data-fragment-index="1"--> <span style="font-size:30px">
-- Wray </span></center>
#+END_QUOTE
Note:
Ces seuils de 90% ainsi que l'ampleur des conséquences sont très
discutés, d'autant plus que certains chercheurs échouent à obtenir des
résultats similaires en utilisant les données disponibles
publiquement. Ils demandent donc à Reinhart et Rogoff l'ensemble des
données et des feuilles de calculs utilisées dans l'étude et ces
derniers finissent par leur fournir.
Dans ces feuilles, des erreurs de calcul évidentes apparaissent
rapidement ainsi que des traitement de données assez douteux
(exclusion de données, pondérations suspectes, etc.).
Reinhart et Rogoff répondent point par point en expliquant que ces
quelques erreurs ne changent rien au résultat final, que leur façon de
calculer les statistiques sont tout à fait standard.
En fait, une fois les détails révélés, pour beaucoup de chercheurs ces
calculs n'ont pas beaucoup de sens, les valeurs utilisées sont très
discutables, et il est malhonnête d'utiliser ces travaux pour
justifier une politique d'austérité budgétaire.
Mais le mal est fait. Pendant plus de trois ans, l'austérité n'est pas
présentée comme un choix mais comme une nécessité. Et quand bien même
l'article original est considéré comme non pertinent par les
économistes, ces idées ont fait leur chemin et sont difficiles à
détrôner.
Au delà du caractère idéologique de ce genre de travaux, une des
raisons pour lesquelles ce débat a mis autant de temps à avoir lieu
est lié à la non publication de l'ensemble des procédures de calcul et
des données utilisées, pratique courante en économie. Sous les feux
de la rampe, les auteurs ont bien été forcés de mettre à disposition
ce qui sous-tendait leur travaux mais sans pression médiatique
particulière, en général, rien ne se passe...
** IRM fonctionnelle
# file:assets/img/Irmf.jpg&size=cover
- <!-- .element class="fragment" --> 2010 : [[https://www.researchgate.net/publication/255651552_Neural_correlates_of_interspecies_perspective_taking_in_the_post-mortem_Atlantic_Salmon_an_argument_for_multiple_comparisons_correction][Bennett et al. et le saumon mort]] \smiley
- <!-- .element class="fragment" --> 2016 : [[http://www.pnas.org/content/113/28/7900.abstract][Eklund, Nichols, and Knutsson]]. [[http://www.sciencealert.com/a-bug-in-fmri-software-could-invalidate-decades-of-brain-research-scientists-discover][A bug in fmri software could
invalidate 15 years of brain research]] (/40 000 articles/)
- <!-- .element class="fragment" --> 2016 : Mais [[https://www.cogneurosociety.org/debunking-the-myth-that-fmri-studies-are-invalid/][c'est plus subtil
que ça]]. [[http://blogs.warwick.ac.uk/nichols/entry/bibliometrics_of_cluster/][Nichols]]. /\approx 3 600 études concernées/
<p class="fragment"> Des méthodes statistiques à améliorer mais pas de
remise en cause fondamentale. </p>
#+BEGIN_EXPORT html
![Irmf](assets/img/Researcher-test.jpg)
#+END_EXPORT
Note:
Continuons avec un autre exemple: l'imagerie cérébrale, qui permet
d'observer l'activité du cerveau d'un individu lorsqu'il effectue une
tâche cognitive et ainsi de mieux comprendre la structure et le
fonctionnement du cerveau. L'IRM fonctionnelle est l'une de ces
techniques et mesure de très faibles variations locales du taux
d'oxygénation du sang dans le cerveau.
En 2010, Craig Bennett et ses encadrants ont une idée saugrenue. Ils
placent un saumon mort dans un appareil d'IRM et lui présentent des
images. Étonnamment, ils observent des signes d'activité cérébrale, ce qui est
pour le moins surprenant puisque le saumon est bel et bien mort. Aussi
drôle que cela puisse paraître, Bennett et ses encadrants savent très
bien ce qu'ils font. Les données brutes obtenues lors d'une IRM sont
très bruitées et toute une série de calculs et de tests statistiques
sont appliqués pour transformer ces données en images
intelligibles. Mais il arrive que le bruit soit trop important, que la
machine soit mal calibrée, que la procédure de calcul soit inadaptée
et que des signaux apparaissent fortuitement.
Leur article rédigé avec un ton très humoristique fait sensation car
il met le doigt sur des faiblesses méthodologiques.
L'an dernier, des collègues me sachant intéressé par ces problèmes de
réplication me font suivre un article récent assez alarmant. Cet article présente un
problème dans les procédures statistiques utilisées dans les logiciels
d'analyse d'IRMf les plus courants, ce qui remet potentiellement en
cause les résultats obtenus ces quinze dernières années. Étant donnée
l'ampleur de l'erreur, les auteurs concluent que 40,000 articles
pourraient être concernés. De plus, les données étant très
volumineuses dans ce domaine, elles ne sont pas archivées et il ne
sera pas possible de simplement les réanalyser. L'ensemble des
expériences seraient à refaire...
En fait, suite aux retours qui leurs sont faits, les auteurs revoient
rapidement à la baisse leurs estimations assez alarmistes.
Au final, le problème méthodologique et la capacité à vérifier les
études suite à des erreurs de calcul reste entier même s'il ne remet
pas pour autant en cause l'ensemble des résultats obtenus ces
dernières années.
** Les fausses structures de protéines
#+BEGIN_EXPORT html
<img src="assets/img/flipping_fiasco.png" style="float:right;width:250px"/>
#+END_EXPORT
*Geoffrey Chang* : étude de la structure de protéines présentes dans
des bactéries résistant aux antibiotiques. MsbA de Escherichia Coli (Science, 2001),
Vibrio cholera (Mol. Biology, 2003), Salmonella typhimurium
(Science, 2005)
<span class="fragment" data-fragment-index="1"> *2006* : Incohérences,
alertes, puis 5 rétractations </span>
#+BEGIN_QUOTE
<!-- .element class="fragment" data-fragment-index="2" style="font-size:30px"-->
a homemade data-analysis program had flipped
two columns of data, inverting the electron-density map from which his
team had derived the protein structure.
<!-- .element class="fragment" data-fragment-index="2" style="font-size:30px"--> -- [[https://people.ligo-wa.caltech.edu/~michael.landry/calibration/S5/getsignright.pdf][une "erreur
de programmation"]]
#+END_QUOTE
Note:
Un dernier exemple, cette fois-ci en cristallographie.
Geoffray Chang est un chercheur à la trajectoire fulgurante,
récompensé par de nombreux prix. Son équipe, basée au Scripps
Institute à l'Université de Californie San Diego, a publié une série
d'articles dans des revues prestigieuses et détaillant la structure de
certaines protéines présentes dans les membranes de cellules. Ces
protéines jouent un rôle essentiel dans la résistance de ces bactéries
à certains médicaments et connaître leur structure est une étape
importante dans la compréhension de leur fonctionnement.
Hélas, peu de temps après, d'autres équipes de chercheurs qui étudient
des protéines très similaires rapportent des structures anormalement
différentes de celles publiées par Chang et son équipe. En lisant ces
travaux Chang, horrifié, remonte vite à la source du problème.
Un des codes d'analyse aurait inversé deux
colonnes de données et ainsi inversé la répartition de la densité
d'électrons à partir de laquelle la structure finale de la protéine
est calculée. D'après Chang, ce code aurait été hérité d'un autre
laboratoire et s'était également répandu depuis dans d'autres équipes.
Même si toute l'acquisition des données avait été faite soigneusement,
ce n'était pas le cas de l'analyse et ce petit grain de sable a
conduit à la rétractation immédiate de 5 articles par Chang et son
équipe. Ces publications ont eu un impact énorme sur la communauté, à
tel point que plusieurs années après la rétractation, les résultats
contradictoires avec ceux de Chang paraissaient suspects avaient du
mal à être publiés.
** Crise de foi ?
#+BEGIN_EXPORT html
<img src="assets/img/in_science_we_trust_small.jpg" style="float:right;width:240px"/>
#+END_EXPORT
- [[http://www.nature.com/nrd/journal/v10/n9/full/nrd3439-c1.html?foxtrotcallback=true][Oncologie]] : "/plus de la moitié des études publiées, même dans des
journaux prestigieux, ne/ /peuvent être reproduites en laboratoire
industriels/"
- [[http://theconversation.com/we-found-only-one-third-of-published-psychology-research-is-reliable-now-what-46596][Psychologie]] : "réplication d'une centaine d'articles /seulement un
tiers de résultats cohérents/"
<span class="fragment" data-fragment-index="2"> *Lanceurs d'alerte* ou
*institutions malades* ? </span>
*** <span class="fragment" data-fragment-index="2"> La remise en cause fait partie du processus scientifique</span>
*** <span class="fragment" data-fragment-index="2"> Tout comme la rigueur et la transparence...</span>
Note:
Il n'y a à ce jour pas un domaine des science qui ne soit épargné par
ces difficultés à reproduire les travaux publiés. En oncologie, un
article récemment publié rapporte que plus de la moitié des études
publiées ne peuvent être reproduites en laboratoire industriel, et ce
même si les études sont publiées dans des journaux prestigieux.
En psychologie, les capacités à reproduire les résultats publiés sont
également très basses.
Le problème est méthodologique mais également certainement
sociologique, lié à une pression productiviste trop importante. Mais
attention aussi à ne pas donner non plus trop d'importance aux signaux
d'alertes que nous venons de voir...
Le problème est compliqué mais il faut garder à l'esprit que la remise
en cause fait partie du processus scientifique. Il n'est donc pas
surprenant que de telles difficultés de reproduction de travaux
scientifiques soit présentes.
Cependant, deux autres caractéristiques essentielles du processus
scientifique sont la rigueur et la transparence et il est clair que
dans l'ensemble des cas que nous venons de voir il manquait souvent
l'un et l'autre...
* C028AL-W2-S2 (\approx 11:30); Pourquoi est-ce difficile ?
** Le document computationnel
_Module 2. La vitrine et l'envers du décor : le document computationnel_
1. Exemples récents d'études assez discutées
2. *Pourquoi est-ce difficile ?*
3. Le document computationnel : principe
4. Prise en main de l'outil <br/> Au choix :
- Jupyter
- Rstudio
- OrgMode
5. Travailler avec les autres
6. Analyse comparée des différents outils
** <!-- .slide: class="center" --> Pourquoi est-ce difficile ? file:assets/img/box-she-s-told-not-to-open-in-it-the-gods-had-placed-all-the-evils-9vbl9q-clipart.jpg&size=contain
Note: Comme nous l'avons vu, reproduire les travaux de recherche, même
publiés dans des revues prestigieuses est souvent assez
difficile. Dans cette séquence, nous allons identifier les difficultés
les plus communes.
** 1) Le manque d'informations
Expliciter :
+ *Sources* et *données*
<center> /Données non disponibles = résultats difficiles à vérifier/
</center><br/>
+ <!-- .element class="fragment" data-fragment-index="2" --> *Choix*
<center class="fragment" data-fragment-index="2" > /Choix non expliqués = choix suspicieux/
</center><br/>
*** <!-- .element class="fragment" data-fragment-index="3" --> Le cahier de laboratoire peut vous aider
Note: La première source de difficultés rencontrées lors de tentatives
de reproduction est tout simplement le manque d'informations.
Si on ne prend pas soin d'expliciter comment on a obtenu nos données
et qu'on les garde secrètes, il est certain qu'il va être difficile
pour une tierce personne de vérifier si elle arrive aux mêmes
conclusions ou pas.
# C'est étrange car mettre les données utilisées à disposition permet au
# lecteur d'en évaluer la qualité (voire d'y trouver des erreurs). Sans
# cette évaluation, difficile pour le lecteur de savoir quelle confiance
# avoir dans les conclusions de l'article.
De même expliciter les choix effectués à chacune des étapes de l'étude
s'avère essentiel. Quel protocole expérimental a été choisi et
pourquoi ? Quelles données ont été conservées ? Quelles données ont
été soigneusement écartées et pourquoi ? Quelle procédure statistique
a été utilisée et les hypothèses sous-jacentes étaient elles
raisonnables ? Etc.
Après tout, on doit toujours faire des choix à un moment donné. Mais
ne pas expliquer ces choix, même en étant rigoureux et de bonne foi,
c'est prendre le risque que les lecteurs deviennent
suspicieux. D'autre part, être totalement transparent sur ces choix,
c'est permettre à d'autres (ou à vous-même) de décider s'il est
nécessaire de revenir dessus ou pas
Pour garder trace de tous ces choix et des informations sur ces
données, le cahier de laboratoire un outil essentiel. Encore faut-il
ensuite mettre ces informations à disposition, mais nous reviendrons
sur ce point par la suite.
** 2) L'ordinateur, [[http://theconversation.com/how-computers-broke-science-and-what-we-can-do-to-fix-it-49938][source d'erreurs]]
<br/>
- *Point and click* :
- <!-- .element class="fragment" data-fragment-index="2" --> *Les tableurs* : [[https://qz.com/768334/years-of-genomics-research-is-riddled-with-errors-thanks-to-a-bunch-of-botched-excel-spreadsheets/][erreurs de programmation]] et de manipulation de données
- <!-- .element class="fragment" data-fragment-index="2" style="font-size:30px"-->
~Membrane-Associated Ring Finger (C3HC4) 1, E3 Ubiquitin Protein
Ligase~ \to ~MARCH1~ \to 2016-03-01 \to 1456786800
- <!-- .element class="fragment" data-fragment-index="2" style="font-size:30px"-->
~2310009E13~ \to 2.31E+19
- <!-- .element class="fragment" data-fragment-index="3" --> *Pile logicielle complexe*
- <!-- .element class="fragment" data-fragment-index="4" --> *Bug* : /Programmer, c'est dur !/
Note:
La deuxième source de difficultés rencontrées lors de tentatives
de reproduction de travaux est tout simplement les erreurs induites
par l'utilisation effrénée des ordinateurs.
Comme toute innovation technologique, les ordinateurs nous permettent
d'aller plus vite, plus loin mais aussi de faire des erreurs plus
facilement et plus rapidement...
Au premier plan des sources d'erreurs, ces logiciels intuitifs où
l'interaction se fait à la souris et qui ne permettent pas
d'expliciter ce qui est calculé et à partir de quoi. Leur simplicité
d'utilisation incite à les utiliser pour tout, même pour ce pour quoi
ça n'est pas vraiment prévu.
Il est par exemple très difficile de comprendre la logique du calcul
ayant lieu dans une feuille excel pleine de macros. Bien sûr, il est
possible de gérer des stocks et la comptabilité d'une entreprise avec
un tableur, mais ceux qui ont déjà eu à faire à ce genre
d'abominations savent qu'un ERP permet d'éviter bien des soucis. Et
bien de la même façon, un tableur n'est pas le bon outil pour faire
des statistiques ou du traitement de données !
Tenez, quelques exemples d'anecdotes effroyables liées à l'utilisation
d'un tableur. En génomique, il est bien pratique de donner des petits
noms aux gènes tels que celui-ci. Celui-ci, c'est MARCH1. Seulement
pas mal de tableurs croient bien faire en l'interprétant
comme une date et par effet de bord comme le nombre de secondes
écoulées depuis le 1er janvier 1970... L'identifiant de gène 231 000
9E13 se retrouve lui aussi fréquemment convertit en nombre. Alors bien
sûr, il n'y a peut-être qu'une vingtaine de gènes concernés par ce
genre de problème sur les 30,000 du génome humain, mais c'est quand
même assez désagréable.
De manière générale, il est courant de se reposer sur une pile
logicielle complexe. Complexe et souvent mal maîtrisée. Combien
d'études reposent ainsi sur des logiciels propriétaires, sortes de
boites noires dont on ne maîtrise pas le contenu et qui appliquent
aveuglement des procédures de calculs et de transformations de
données?
# - l'utilisation de telle ou telle méthode plutôt qu'une autre est
# souvent discutable
Alors, je ne suis pas en train de dire qu'il faut tout reprogrammer
soi même. Ce n'est bien sûr par la meilleure façon d'échapper aux
bugs. Dans les cas de l'étude Reinhart et Rogoff ou des fausses
structures de protéines de Chang, les erreurs venaient de programmes
maisons.
Mais il me semble essentiel d'être en mesure de déterminer dans son
analyse si chacune des briques est digne de confiance ou pas. Et si
l'un des composants, par sa nature, l'interdit, il faut sérieusement
songer à le remplacer.
** L'informatique, seule responsable ?
<br/>
*Le manque de rigueur et d'organisation*
- Pas de backup
- Pas d'historique
- Pas de contrôle qualité
Note:
Enfin, la dernière cause méthodologique de non-reproductibilité et
source d'erreurs est certainement le mangue de rigueur et
d'organisation.
Même si le stockage ne coûte plus rien de nos jours, la sauvegarde des
données est souvent mal assurée et il est courant d'en perdre suite à
une mauvaise manipulation, ou bien à la suppression de son compte
informatique lors du passage d'une institution à une autre.
En l'absence de mécanisme de gestion de version, il est courant
de remplacer par inadvertance d'anciennes données par de nouvelles et
de ne plus arriver à accéder à d'anciennes observations.
Dans un certain nombre de domaines, l'utilisation de plans
d'expériences randomisés ou de pré-études (study pre-registration),
n'est absolument pas systématique. De même les bonnes pratiques de
développement logiciel comme la revue de code ou l'intégration
continue sont encore rarement appliqués au logiciels utilisés dans la
recherche.
** Une dimension culturelle et sociale
#+BEGIN_QUOTE
<center> Article = version _simplifiée_ de la procédure </center>
#+END_QUOTE
<br/>
#+BEGIN_QUOTE
<center>
*Tracer* toutes ces informations et les *rendre disponibles* =
investissement conséquent
</center>
#+END_QUOTE
<br/>
Si personne n'exige/n'inspecte ces informations, à quoi bon
s'embêter ?
Note:
Enfin, il serait naïf de ne pas évoquer la dimension culturelle et
sociale du problème.
Un article est une version simplifiée et intelligible des
résultats. Certains diraient même la publicité... Une description de
haut niveau est essentielle car elle permet de prendre du recul mais
elle est devenue la norme alors que la technicité de la recherche
actuelle est telle qu'il est clairement impossible de donner dans un
document de 8 à 10 pages toutes les informations permettant de refaire
les expériences et les analyses.
- La description du protocole expérimental est souvent succincte
- Les données sont généralement bien trop nombreuses pour être données
in extenso et sont résumées à travers quelques courbes.
- Les traitements statistiques appliqués pour parvenir à ces courbes
ne sont décrits que rapidement.
Alors, bien sûr il est possible de tracer toutes ces informations et
de les mettre à disposition. À ceci près que cela demande du temps,
voire beaucoup de temps si on ne dispose pas des bons outils.
# - sans compter que mettre à disposition toutes ces informations, alors
# qu'on a soi-même peiné à les obtenir, c'est permettre à d'autres de
# récupérer les fruits de notre travail sans efforts.
Mais si personne n'exige ces informations, à quoi bon s'embêter ?
** Tout rendre public ?
<br/>
- Les /faiblesses/ deviendraient évidentes
- <!-- .element class="fragment" -->Quelqu'un pourrait trouver une /erreur/
- <!-- .element class="fragment" -->Quelqu'un pourrait en [[http://www.nature.com/news/the-top-100-papers-1.16224][tirer avantage à ma place]]
- <!-- .element class="fragment" --> /Les données peuvent être sensibles/
# sécurité, machine learning pour la police
#+BEGIN_EXPORT html
<br/>
#### <!-- .element class="fragment" --> Donnons nous les moyens que tout soit inspectable à la demande
#+END_EXPORT
Note:
Mais donner accès, mettre à disposition, cela veut dire tout rendre
public ? N'est-ce pas un peu radical ? Et risqué ? Démontons ensemble
quelques idées reçues.
Si je donne accès à tout ce que j'ai fait, il deviendra alors évident
que ce que j'ai fait n'est pas aussi parfait que ce que je prétends,
que c'est un peu sale et pas toujours très rigoureux, que j'ai
sélectionné les résultats que je présente.
- C'est sûr. En même temps, c'est la réalité et vous auriez tort de
croire que vous êtes le seul dans cette situation. Si ça se trouve,
vous travaillez mieux que les autres et dans un domaine où la
réputation est essentielle, vous avez probablement plutôt intérêt à
le montrer. Pire, si vous le cachez, cela finira par paraître
suspicieux.
Vous me direz qu'en révélant tout, je prend le risque que quelqu'un
trouve une erreur et de passer pour un imbécile.
- C'est certain, mais tout le monde fait des erreurs, même les plus
grands. Et en ce qui me concerne, je préfère que quelqu'un trouve
une erreur et m'aide à la corriger afin que mes travaux deviennent
corrects.
Oui, mais quelqu'un pourrait tirer parti, réanalyser ces données que
j'ai eu tant de mal à obtenir, ou simplement utiliser ce code que j'ai
eu tant de mal à écrire et faire trois ou quatre papiers là où je n'ai
eu le temps d'en faire qu'un.
- Alors d'abord, si quelqu'un réutilise votre travail, il se doit de
le citer correctement et de vous rendre le crédit qui vous est
dû. Ensuite les articles les plus cités de tous les temps sont des
articles présentant des contributions méthodologiques ou du logiciel
qui sont devenus essentiels dans un domaine.
Une petite parenthèse : ceux d'entre vous qui connaissent github,
savent que cette plate-forme est à mi-chemin entre la plate-forme de
développement logiciel et le réseau social. Les contributions d'un
développeur à différents projets sont visibles ainsi que la
fréquence de ses contributions, ce qui permet à un jeune développeur
de se faire une carte de visite infalsifiable et
ultra-visible. Montrer ce que l'on fait est une façon efficace
d'atteindre une certaine forme de reconnaissance par la
communauté. Mettre ses travaux à disposition de tous est
probablement la meilleure façon de démontrer sa propriété
intellectuelle.
Enfin, il est possible que les données soient sensibles et ne puissent
être divulguées sans prendre le risque de causer du tort à des
gens. Par exemple, s'il s'agit de données médicales, de données
judiciaires, d'informations sur des enfants ou sur des intentions de
vote, etc.
- Dans ce type de situation où les travaux ont une dimension éthique,
il convient de définir quelles personnes peuvent avoir accès aux
informations pour les vérifier ou les réutiliser. Ensuite, il existe
des techniques cryptographiques assez faciles d'accès permettant de
s'assurer que seulement les personnes habilitées peuvent accéder aux
données.
Dans tous les cas, même si au final ces informations sont
semi-publiques, il est essentiel de se donner les moyens de permettre
à autrui d'inspecter ce que nous avons fait.
** Outils à éviter et alternatives
<br/>
- *Outils, formats, et services propriétaires*
1. <!-- .element class="fragment" --> <strike> excel, word, evernote </strike>
- markdown, orgmode, csv, hdf5, ...
2. <!-- .element class="fragment" --> <strike> SAS, Minitab, matlab, mathematica, ... </strike>
- scilab, R, python, ...
3. <!-- .element class="fragment" --> <strike> dropbox, cahiers de labo en ligne propriétaires, ... </strike>
- framadrop, gitlab/github, ...
- <!-- .element class="fragment" --> *Outils "intuitifs" *
- <strike> tableurs, interfaces graphiques, exploration interactive
</strike>
- apprendre à se contrôler... ☺
- R, python, ...
Note:
Et pour permettre l'inspection, il faut utiliser les bons outils
Cela commence par banir autant que possible les logiciels et les
formats propriétaires. Bien sûr, ces outils sont bien faits et vous y
êtes habitués mais on en est également captif et les entreprises qui
les développement n'offrent aucune garantie sur le long terme. Je suis
sûr que ces mises à jours automatiques vous agacent vous aussi. :)
L'expérience montre qu'il est hélas très courant de perdre des données
et des informations lors de ces mises à jour.
Alors, soyons honnête, l'utilisation de logiciel libre ne vous protège
absolument pas de ce genre de mauvaises surprises. Mais comme vous
avez accès librement à l'ensemble des versions, les chances d'arriver
à récupérer vos données sont quand même bien plus élevées. De même
l'adoption de formats textes simples et ouverts augmente vos chances
d'arriver à les relire avec d'autres logiciels.
En ce qui me concerne, à chaque fois que j'ai utilisé un format
binaire ou pas bien ouvert, j'ai fini par perdre des données. Cela
fait donc 10 ans que je n'utilise plus que des formats texte ou des
standards binaires ouverts et le problème ne s'est plus jamais posé,
et ce malgré les mises à jours logicielles très régulières de ma
machine.
Donc règle numéro 1 : utiliser autant que possible du format texte
(markdown, orgmode pour vos notes, csv pour vos données).
Règle numéro 2 : utiliser autant que possible les logiciels et les
langages de programmation libres comme R ou python.
Et Règle numéro 3 : éviter de stocker vos données chez un hébergeur
dont vous pourriez être captif.
En effet, les services gratuits (ou pas) et très intégrés sont
tentants mais correspondent à un business plan particulier qui peut se
révéler incompatible avec vos besoins futurs, ne pas être pérenne et
ne vous donne pas forcément les garanties de confidentialité que vous
souhaiteriez.
Enfin, attention aux tableurs et outils graphiques qui peuvent vous
donner au premier abord l'impression d'une meilleur efficacité et
productivité mais qui sur le long terme ne vous permettent pas
d'atteindre la traçabilité et l'inspectabilité que vous souhaiteriez.
C'est plus difficile, en particulier au début, mais en utilisant des
langages comme R ou python, passé la première marche, on gagne
rapidement en puissance et en efficacité.
** Conséquences :noexport:
- Des *erreurs*...
- Des *difficultés* certaines à *réutiliser* le travail des autres, voire
son propre travail
- Un *doute* dommageable pour tout le monde (auteur, détracteurs,
lecteur, décideur...)
<br/>
Note:
C'est pour toutes ces raisons que les résultats de recherche
contiennent parfois des erreurs et sont si difficile à répliquer et à
réutiliser, même au sein d'une même équipe.
Les doutes que cela engendre sont dommageable pour tout le
monde. Lorsque l'on propose un résultat, il n'est pas agréable d'être
soupçonné de fraude ou d'incompétence. En même temps, les détracteurs
d'un résultat apparaissent comme de simples aigris ou au contraire
comme des lanceurs d'alertes selon le contexte alors qu'il est normal
de questionner un résultat et d'avoir un débat apaisé et rationnel à
son sujet.
Face à ces problèmes, il me semble que la meilleur attitude à avoir
est celle de la transparence : Expliciter augmente les chances de
trouver les erreurs et de les éliminer.
C'est d'ailleurs une demande de plus en plus pressante de la part
de la société civile afin d'éviter les dérives et d'améliorer
l'efficacité de nos travaux.
** Changement de paradigme
1. Manque d'information, problème d'accès aux données
2. Erreurs de calcul
3. Manque de rigueur scientifique et technique
#+BEGIN_EXPORT html
<img src="assets/img/in_science_we_trust_small.jpg" style="height:200px"/>
<img src="assets/img/in_code_we_trust.jpg" style="height:200px"/>
#+END_EXPORT
*** Expliciter augmente les chances de trouver les erreurs et de les éliminer
# Demande de *traçabilité* de plus en plus pressante de la société, des
# institutions, de l'Europe, ...
Note:
Nous avons vu que la première cause d'échec de reproduction de
résultats scientifiques est tout simplement le manque d'information,
la non disponibilité des données ou des procédures appliquées. Cela ne
signifie pas que le résultat soit faux mais cela empêche de le
vérifier et de s'appuyer dessus.
La seconde cause d'échec est tout simplement l'erreur de calcul qui
peut se glisser n'importe où.
De manière générale, le manque de rigueur scientifique et technique
est souvent à l'origine de ces deux problèmes.
Il me semble que la meilleur attitude à avoir est celle de la
transparence : Expliciter augmente les chances de trouver les erreurs
et de les éliminer. C'est pour cela que nous assistons ces dernières
années à un changement de paradigme de recherche et que l'on exige un
accès à l'ensemble des données et des procédures de calcul.
C'est d'ailleurs une demande de plus en plus pressante de la part de
la société civile (en particulier le Conseil Européen) afin d'éviter
les dérives et d'améliorer l'efficacité de nos travaux.
* C028AL-W2-S3 (\approx 7:40); Le document computationnel : principe
** Le document computationnel
_Module 2. La vitrine et l'envers du décor : le document computationnel_
1. Exemples récents d'études assez discutées
2. Pourquoi est-ce difficile ?
3. *Le document computationnel : principe*
4. Prise en main de l'outil <br/> Au choix :
- Jupyter
- Rstudio
- OrgMode
5. Travailler avec les autres
6. Analyse comparée des différents outils
** <!-- .slide: class="center" --> Le document computationnel : <br> principe file:assets/img/iceberg.jpg&size=contain
Note:
Dans cette séquence, je vais vous présenter ce qu'est un document
computationnel ainsi que les principes généraux que nous retrouverons
dans chacun des trois environnements dont je vous ai précédemment
parlé. L'intérêt de ce type de document est de permettre une
transparence la plus complète possible.
** La science moderne
<br>
#+BEGIN_EXPORT html
<img src="assets/img/iceberg_publication-1.png" data-fragment-index="1" class="fragment current-visible"/>
<img src="assets/img/iceberg_publication-2.png" data-fragment-index="2" class="fragment current-visible"/>
<img src="assets/img/iceberg_publication-3.png" data-fragment-index="3" class="fragment current-visible"/>
<img src="assets/img/iceberg_publication-4.png" data-fragment-index="4" class="fragment current-visible"/>
<img src="assets/img/iceberg_publication-5.png" data-fragment-index="5" class="fragment current-visible"/>
#+END_EXPORT
Note:
# Data \to visualization/analysis \to article
Si une partie de l'activité scientifique nécessite des mesures sur le
terrain ou derrière une paillasse, la majeure partie se passe
maintenant derrière un ordinateur, les données provenant de machines
spécifiques : je pense par exemple à un accélérateur de particules, des
séquenceurs d'ADN, un téléscope, un réseau de capteur ou bien sûr des
simulations numériques s'exécutant sur des supercalculateurs.
Une fois ces données obtenues, elles sont transformées pour être
analysées, visualisées afin de mieux en comprendre la structure. Il
est courant de partager ces visualisations avec des collègues,
d'avoir un certain nombre d'itérations, de passer d'une vue à une
autre jusqu'à trouver celle qui explique le mieux les choses. On
utilise d'ailleurs souvent une multitude de logiciels spécifiques pour
obtenir ces visualisations.
Il arrive souvent qu'on soit déçu par les résultats, qu'on n'y
comprenne rien ou qu'on se rende compte que les données ne sont pas
intéressantes et qu'il faut se poser la poser la question sous un
angle différent.
Dans ce cas, retour à la case départ : acquisition de
données, visualisations, statistiques, nombreux échanges avec les
collègues...
Puis ça y est, on trouve enfin quelque chose d'intéressant. On prend
alors nos plus belles figures, on y ajoute les explications qui sont
finalement les bonnes, on tente de rendre tout cela intéressant et on
envoie l'ensemble à une conférence ou un journal.
Hélas, dans un pdf de 8 pages, le lecteur trouvera une jolie histoire,
des figures convaincantes mais n'aura aucune idée du réel travail
effectué. L'article, c'est la partie émergée de l'iceberg et il n'y a
alors plus aucun moyen de revenir sur les nombreuses tentatives et
échecs, ni sur les calculs et les données derrière chacune de ces
figures.
La recherche reproductible, c'est permettre de pouvoir naviguer dans
les deux sens et de combler le fossé séparant l'auteur du lecteur.
** Objectifs méthodologiques
<br>
Garder trace afin de :
- *Inspecter* : justifier/comprendre
- *Refaire* : vérifier/corriger/réutiliser
Note:
Notre objectif est donc d'avoir un outil nous permettant :
- d'une part d'inspecter toute cette démarche, afin que l'auteur
puisse justifier pourquoi tel ou tel code est utilisé et que le
lecteur puisse comprendre ce qui a été fait;
- et d'autre part de refaire le calcul et l'analyse le plus
simplement possible, ce qui est essentiel
1. pour permettre aux lecteurs de vérifier que ces calculs sont
corrects,
2. pour permettre éventuellement de corriger des erreurs s'il y en a
3. et enfin pour permettre à d'autres de réutiliser ces travaux, soit
sur un jeu de données différent, soit en réutilisant une partie de
la procédure d'analyse dans un autre contexte.
** La vitrine... <span data-fragment-index="1" class="fragment">et l'envers du décor </span>
#+BEGIN_EXPORT html
<img src="assets/img/example_pi_full-1.svg" style="height:600px" data-fragment-index="0" class="fragment current-visible"/>
<img src="assets/img/example_pi_full-2.svg" style="height:600px" data-fragment-index="1" class="fragment current-visible"/>
<img src="assets/img/example_pi_full-3.svg" style="height:600px" data-fragment-index="2" class="fragment current-visible"/>
<img src="assets/img/example_pi_full-4.svg" style="height:600px" data-fragment-index="3" class="fragment current-visible"/>
<img src="assets/img/example_pi_full-5.svg" style="height:600px" data-fragment-index="4" class="fragment current-visible"/>
<img src="assets/img/example_pi_full-6.svg" style="height:600px" data-fragment-index="5" class="fragment current-visible"/>
#+END_EXPORT
Note:
Voici la partie émergée du document computationnel. Au premier abord,
il s'agit d'un document tout à fait banal avec un titre, du texte,
éventuellement un petit morceau de code illustrant une procédure de
calcul, des résultats numériques, des formules de maths, des figures,
etc. Bref, un article classique au format pdf ou html.
Voici maintenant ce qui se cache derrière ce document : ici, un
notebook Jupyter tel que nous pouvons le voir dans un navigateur
web. C'est un document dynamique constitué de différentes parties sur
lesquelles on peut interagir.
Tout d'abord du texte au format markdown : ce sont les zones de texte
que j'ai surlignées en orange. Le formattage est assez simple, on peut
assez facilement y inclure des liens hypertextes ou des formules
mathématiques.
Entre ces zones de texte, on trouve des zones de code, que j'ai
surlignées en bleu. Ici il s'agit de fragments de code python
relativement simples. Dans cet environnement, il est possible d'éditer
directement ces fragments de code et les exécuter. En fait, un
notebook a en interne une console python ouverte et lorsque l'on
demande l'exécution d'un fragment de code, le code est directement
envoyé dans la console et le résultat est automatiquement récupéré.
Le résultat de chacun de ces différents codes est stocké juste en
dessous dans les zones que j'ai surlignées en jaune. Puisque cette
console reste "vivante" tout au long du document, les résultats
calculés dans un bloc sont visibles dans le bloc suivant, ce qui
encourage à ne pas écrire de longs blocs de code infâmes, mais au
contraire à écrire de petits fragments, à calculer les choses petit à
petit, tout en expliquant dans les zones de texte (en orange) comment
les différents fragments de code (en bleu) s'enchaînent et éventuellement
pourquoi, en fonction de ce que l'on vient de calculer (en jaune), on
décide d'appliquer tel nouveau fragment.
Une fois satisfait avec les calculs, on aime en général bien créer un
document classique en exportant vers du pdf ou du html. Chaque zone
(texte, code, résultat) est convertie et assemblée en un seul document
markdown qui est à son tour transformé vers le format désiré avec un
outil comme pandoc.
Bien sûr, dans le document final, on ne souhaite pas forcément rendre
tous les fragments de codes et tous les résultats visibles. C'est la
raison pour laquelle pour chacune de ces zones, il est possible de
spécifier si l'on souhaite la cacher ou pas.
Enfin, si les résultats intermédiaires sont stockés automatiquement
dans le notebook, l'environnement permet de ré-exécuter très
simplement l'ensemble du code du notebook et de mettre à jour les
résultats.
C'est donc à vous de décider, selon le contexte, si vous souhaitez
partager le document final, qui est souvent plus compact, ou le document
computationnel qui va permettre une inspection complète et une
réutilisation.
** Les différents outils
1. Jupyter
2. Rstudio/knitR
3. Org mode
# | Principes | Différences |
# |---------------------------------+--------------------|
# | • Explications, code, resultats | • Syntaxe |
# | • Session | • Interopérabilité |
# | • Export | • Contrôle export |
<br/>
<table class="fragment" data-fragment-index="1">
<tr>
<td class="fragment" data-fragment-index="1"> *Principes identiques* </td>
<td class="fragment" data-fragment-index="2"> *Différences* </td>
</tr>
<tr>
<td class="fragment" data-fragment-index="1"><ul style="font-size:30px">
<li> *1 seul document* : <br> explications, code, résultats
<li> Session
<li> Export
</ul></td>
<td class="fragment" data-fragment-index="2"><ul style="font-size:30px">
<li> Syntaxe <br/> <span style="color:white">.</span>
<li> Interopérabilité des langages
<li> Contrôle export
</ul></td>
</tr>
</table>
Note:
Les trois environnements les plus matures permettant de créer de tels
documents sont Jupyter, que vous venez de voir, Rstudio/knitr, et
Org-mode. Ces trois environnements se distinguent par le niveau de
technicité nécessaire à leur mise en oeuvre. Je ferai une petite démo
de chacun de ces trois environnements dans les séquences suivantes. À
l'issue de ces démonstrations, vous pourrez choisir lequel vous
convient le mieux.
Vous verrez que le principe reste le même dans les trois environnements :
- Tout d'abord, avoir un seul document comprenant un entrelacs
d'explications au format markdown, de code exécutable simplement, et
les résultats de ces exécutions.
Cette organisation permet l'inspection et la réexécution que nous
nous étions fixés comme objectifs.
- En interne, une console python ou R est active et assure une
persistance des variables d'un fragment de code à l'autre. C'est la
notion de session sur laquelle nous reviendrons pendant les
démonstrations.
- Enfin, il est possible d'exporter le document computationnel vers un
format plus traditionnel éventuellement en masquant certaines
parties.
Les différences entre ces différents environnements sont relativement
mineures :
- Il y a quelques différences de syntaxe. Jupyter et Rstudio utilisent
du markdown alors que Org mode utilise le format org qui est
légèrement différent mais tout aussi lisible. La
façon d'indiquer les zones de code et les résultats est également un
peu différente mais c'est sans grande importance une fois dans
l'environnement correspondant.
- Plus important, peut-être l'interopérabilité entre différents
langages. Jupyter vous permet de faire du python, du R, du ruby ou
bien du julia mais pas vraiment d'utiliser plusieurs langages dans
un même notebook. /Enfin/, c'est possible mais ça demande un peu de
travail.
Rstudio est conçu spécifiquement autour du langage R. Même s'il est
possible d'utiliser du code python, vous verrez que ça n'est pas
aussi convivial que pour R.
Enfin, Org-mode permet une interaction entre les différents langages
relativement naturelle mais comme je le disais, la courbe
d'apprentissage est un peu plus raide.
- Enfin, ces outils diffèrent par le contrôle offert en terme de mise
en page lors de l'export. Jupyter et Rstudio se reposent sur
markdown et donc sur pandoc. Le style par défaut est très bien,
surtout si on souhaite produire du HTML. Mais si on doit produire un
document PDF respectant un style particulier, ça peut être peu
compliqué de demander à pandoc d'appliquer ce style.
Org-mode ne fait à peu près rien pour vous de ce point de vue là. Il
vous faudra donc de toutes façons configurer le style de votre
export. Ceci dit, un des points que j'apprécie particulièrement
lorsque je prépare un article en latex avec org-mode, c'est la
capacité à écrire directement du LaTeX qui sera passé tel quel lors
de l'export, ce qui me permet de faire exactement ce que je
souhaite.
Bien. Vous savez tout. Alors maintenant, Démo !
* C028AL-W2-S4-A; Prise en main de l'outil (Jupyter)
** Le document computationnel
_Module 2. La vitrine et l'envers du décor : le document computationnel_
1. Exemples récents d'études assez discutées
2. Pourquoi est-ce difficile ?
3. Le document computationnel : principe
4. *Prise en main de l'outil* <br/> Au choix :
- *Jupyter*
- Rstudio
- OrgMode
5. Travailler avec les autres
6. Analyse comparée des différents outils
** Prise en main de l'outil : <br> Jupyter
#+BEGIN_EXPORT html
<br>
<br>
<img src="assets/img/jupyter-logo.png" style="width:400px"/>
#+END_EXPORT
** Lancement
- Ouverture d'un document
- Description rapide
- Sauvegarde
- Aide
** Exécution des blocs
- Exécution et récupération des résultats
- Ajout d'un bloc
- Attention à l'ordre
- Notion de session
- Incohérences possibles
- Tout réexécuter depuis le début
** Raccourcis clavier, <br> auto-complétion, <br> et Ipython magic
- Raccourcis clavier =<h>=
- Complétion python (exemple de numpy)
- =%matplotlib=, =%lsmagic=
# =%run=, =%load=, =%load_ext=
** Utiliser d'autres langages
- Exemple pour R :
- =%load_ext rpy2.ipython=
- =%%R %%sh %%perl=
- Interaction entre =R= et =python= possible
- mais fragile...
** Production et partage <br> du document final
- Résultats stockés dans le document
- $\to$ visibles dans gitlab
- =git pull/push=
- Export HTML/PDF classique
** Préparer un document
# Contrôler la visibilité du code et des résultats
- Hide-code plugin
- =%%latex= et =%%html=
- [[http://nbconvert.readthedocs.io/en/latest/external_exporters.html][Personnaliser les /exporters/ de NBConvert]] <br>
~jupyter nbconvert --to mypackage.MyExporter~ <!-- .element style="font-size:24px"--> <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ~notebook.ipynb~ <!-- .element style="font-size:24px"-->
** Recap
- Beaucoup d'informations en peu de temps
- Mettez en pratique !
* C028AL-W2-S4-B; Prise en main de l'outil (Rstudio)
** Le document computationnel
_Module 2. La vitrine et l'envers du décor : le document computationnel_
1. Exemples récents d'études assez discutées
2. Pourquoi est-ce difficile ?
3. Le document computationnel : principe
4. *Prise en main de l'outil* <br/> Au choix :
- Jupyter
- *Rstudio*
- OrgMode
5. Travailler avec les autres
6. Analyse comparée des différents outils
** Prise en main de l'outil : <br> Rstudio
#+BEGIN_EXPORT html
<br>
<br>
<img src="assets/img/RStudio-Logo-Blue-Gradient.png" style="height:200px"/>
<img src="assets/img//knitr.png" style="height:200px"/>
#+END_EXPORT
Note:
Même plan que précédemment
** Lancement
- Ouverture d'un document
- Description rapide
- Sauvegarde
- Aide
** Exécution des blocs
- Exécution et récupération des résultats
- Ajout d'un bloc
- Attention à l'ordre (notion de session, incohérences possibles)
- Tout réexécuter depuis le début
** Raccourcis clavier et auto-complétion
- Raccourcis claviers
- Complétion R
- Folding
** Production et partage du document final
- Knit
- Partage à peu de frais via rpubs
** Contrôler la visibilité du code et des résultats
- Complétion (paramètres des blocs)
** Utiliser un style particulier
- pdf, LaTeX
- html
- word/office
Possibilité de faire du LaTeX (R Sweave : =Rnw=) ou du <br/>html (R html :
=Rhtml=) directement pour avoir un contrôle parfait.
** Utiliser d'autres langages
- Ajout et exécution d'un bloc python
- Attention, pas de session !
- Interaction uniquement via fichiers et dans de longs blocs
** Recap
- Beaucoup d'informations en peu de temps
- Mettez en pratique !
* C028AL-W2-S4-C; Prise en main de l'outil (OrgMode)
** Le document computationnel
_Module 2. La vitrine et l'envers du décor : le document computationnel_
1. Exemples récents d'études assez discutées
2. Pourquoi est-ce difficile ?
3. Le document computationnel : principe
4. *Prise en main de l'outil* <br/> Au choix :
- Jupyter
- Rstudio
- *OrgMode*
5. Travailler avec les autres
6. Analyse comparée des différents outils
** Prise en main de l'outil : <br> Org Mode
#+BEGIN_EXPORT html
<br>
<br>
<img src="assets/img/600px-EmacsIcon.svg.png" style="height:200px"/>
<img src="assets/img/442px-Org-mode-unicorn.svg.png" style="height:250px"/>
#+END_EXPORT
Note:
Même plan que précédemment
** Lancement
- Ouverture d'un document
- Description rapide
- Folding / Navigation
- Restructuration
- Sauvegarde
- Aide
** Exécution des blocs
- Ajout d'un bloc R
- Exécution et récupération des résultats
- Attention à l'ordre
- Notion de session
- Incohérences possibles
- Tout réexécuter depuis le début
** Raccourcis clavier
- Bloc expansion
- R graphique
- Python, perl, ...
- Shell session
- Plusieurs sessions, plusieurs langages !
- Communication entre langages possible
** Navigation :noexport:
- Folding
- Restructuration
# - Annotation (tags) ???
# - Sparse Tree ???
** Production et partage <br> du document final
- Git Commit
- Attention aux fichiers produits
- Export
# - Désactiver le recalcul
- Visibilité du code et des résultats
- Sections cachées
** Utiliser un style particulier
- pdf, LaTeX
- html
- Possibilité de reprendre le contrôle
** Recap
- Beaucoup d'informations en peu de temps
- Apprivoiser les raccourcis claviers avec la <br> première entrée du
journal
- Mettez en pratique !
* C028AL-W2-S5; Travailler avec les autres
** Le document computationnel
_Module 2. La vitrine et l'envers du décor : le document computationnel_
1. Exemples récents d'études assez discutées
2. Pourquoi est-ce difficile ?
3. Le document computationnel : principe
4. Prise en main de l'outil <br/> Au choix :
- Jupyter
- Rstudio
- OrgMode
5. *Travailler avec les autres*
6. Analyse comparée des différents outils
** Travailler avec les autres
# file:assets/img/jumping_penguin.png&size=contain
#+BEGIN_EXPORT html
<center><img src="assets/img/jumping_penguin.png" style="width:800px"/></center>
#+END_EXPORT
** Préparer un document pour un journal
Pré-requis pour faire un *pdf* :
- Actuellement caché. En interne /pandoc/, /knitr/ ou /emacs/org-mode/
- /LaTeX/ installé
<!-- .element class="fragment" data-fragment-index="1" --> Export *office/word* possible dans jupyter mais à configurer. Sinon
export *html*...
*<!-- .element class="fragment" data-fragment-index="2" --> Dans tous les cas* <span class="fragment" data-fragment-index="2">:</span>
- <!-- .element class="fragment" data-fragment-index="2" --> Besoin de cacher certaines cellules
- <!-- .element class="fragment" data-fragment-index="2" --> Utiliser le bon style
<br/>
# Soyons honnêtes
*** <!-- .element class="fragment" data-fragment-index="2" --> Produire un tel document demande d'avoir un environnement parfaitement configuré
Note:
Tout ces détails auront été expliqués avant pour chaque environnement.
- http://blog.juliusschulz.de/blog/ultimate-ipython-notebook
- https://github.com/kirbs-/hide_code is a must-have
- http://svmiller.com/blog/2016/02/svm-r-markdown-manuscript/
- https://github.com/balouf/Kleinberg/blob/master/KleinbergsGridSimulator.ipynb
- Il y doit y avoir des choses équivalentes, mais plus simples pour
Rmd
- Et pour emacs, c'est d'une certaine façon plus simple car on est
habitué à bidouiller.
** Convaincre vos co-auteurs
<br/>
Face à cette complexité, plusieurs réactions :
1. Pas grave, c'est génial ! Je m'y mets !
2. Euh... c'est bien. Mais je n'ai pas le temps d'apprendre...
3. Un nouvel outil ? Jamais !
$\leadsto$ différentes organisations possibles
** Option 1 : les co-auteurs enthousiastes
<br/>
Il faudra *assurer le service après-vente* :
- Compatibilité avec les différents environnements
- Gérer cette complexité (jupyter/rstudio/emacs, git, ...)
C'est la meilleure façon de *s'assurer que tout est reproductible* et
inspectable (et pas uniquement sur votre propre machine...)
** Option 2 : investissement a minima
<br/>
Vos co-auteurs vous laissent gérer le code, les résultats mais
adoptent votre style de document.
*Ils peuvent :*
- Éditer le texte de l'article (markdown ou org-mode)
*Ils ne peuvent pas :*
- Recalculer
- Exporter et voir le document final
** Option 3 : les co-auteurs "réfractaires"
<br>
*Les co-auteurs ne changent pas leurs habitudes*
- Un document /computationnel/ séparé produit tous les résultats et
toutes les figures
- Un autre document (/classique/) inclut les figures générées
Mais tout est *conservé*, *documenté* et *recalculable* dans votre document
computationnel !
** Publier / partager votre document
*Rpubs*
- Parfait pour partage rapide, pas pérenne
<!-- .element class="fragment" data-fragment-index="1" --> *Dropbox et autres*
- <!-- .element class="fragment" data-fragment-index="1" --> +Pérénité+,
accès ??, ...
<!-- .element class="fragment" data-fragment-index="2" --> *Gitlab/Github/...*
1. <!-- .element class="fragment" data-fragment-index="2" --> Rendre public (tout l'historique !)
2. <!-- .element class="fragment" data-fragment-index="2" --> Faire le ménage et archiver l'état courant dans un site compagnon
<!-- .element class="fragment" data-fragment-index="3" --> *Sites compagnons*
- <!-- .element class="fragment" data-fragment-index="3" --> Runmycode, Éditeurs, ...
- <!-- .element class="fragment" data-fragment-index="3" --> Article : *HAL* ; code et données : *Figshare / zenodo*
** Conclusion
<br/>
Plusieurs modalités possibles en fonction de :
- vos co-auteurs
- vos contraintes techniques
- vos contraintes de confidentialité/copyright
* C028AL-W2-S6; Analyse comparée des différents outils
** Le document computationnel
_Module 2. La vitrine et l'envers du décor : le document computationnel_
1. Exemples récents d'études assez discutées
2. Pourquoi est-ce difficile ?
3. Le document computationnel : principe
4. Prise en main de l'outil <br/> Au choix :
- Jupyter
- Rstudio
- OrgMode
5. Travailler avec les autres
6. *Analyse comparée des différents outils*
** Analyse comparée <br> des différents outils
#+BEGIN_EXPORT html
<img src="assets/img/jupyter-logo.png" style="width:100px"/>
<img src="assets/img/RStudio-Logo-Blue-Gradient.png" style="height:100px"/>
<img src="assets/img/442px-Org-mode-unicorn.svg.png" style="height:125px"/>
<img src="assets/img/question_mark.png" style="height:100px"/>
#+END_EXPORT
Un document computationnel, <br>
mais pour quoi faire exactement ?
Note:
- Pour comparer ces différents outils, il est important de bien
identifier l'usage que l'on souhaite en faire.
- Nous allons regarder ensemble quelques cas d'usages
** Un cours ou un tutoriel
Un notebook Jupyter
- Facile à prendre en main
- Document dynamique
Note:
- Super pratique.
- Téléchargement, exécution dynamique, résultats interactifs,
variations faciles, etc.
- C'est idéal pour un document à destination d'auto-formation.
** Un journal
[[file:~/org/journal.org][Mon journal en org-mode]]
- Un seul auteur
- Organisation chronologique
- Étiquettes
- Notes, liens, code
Note:
- Structuration type: par date
- Mots-clés
- Navigation aisée
- Réexécution de code comme d'habitude
** Un cahier de laboratoire
[[file:~/Work/Documents/Articles/2018/Alya-Perf/LabBook.org][Un cahier de laboratoire en org-mode]]
- Organisation sémantique
- Conventions
- Plusieurs auteurs
- Étiquettes pour auteurs, <br>expériences, etc.
Note:
- Assez proche d'un journal mais avec un contenu bien plus technique
et fait pour être exploitable par des collègues.
- Exemple de structuration.
** Un article reproductible
[[file:~/Work/Documents/Articles/2017/paper-hpl-at-scale/paper.org][Un article en cours]]
- Plusieurs auteurs
- Regénérer les figures
- Revenir aux sources
Note:
- On voit la structure de l'article.
- Certaines sections sont cachées
- Elles pointent vers le cahier de laboratoire traçant les données
que je vais exploiter.
- Ici, je suis reparti de figure que Tom avait faites et je les ai
retravaillées et adaptées à ce dont j'avais besoin pour mon
article.
- Ici, c'est un peu "sale", il y a des liens vers des fichiers qui
sont sur mon disque dur mais c'est un article en cours de
préparation et vous voyez que j'ai bien accès à l'ensemble des
informations dont j'ai besoin.
- Plusieurs structurations sont possibles. En général, j'ai une
grosse section cachée au début de l'article où j'indique comment
récupérer l'ensemble des données (avec les commandes git ou les
URLs). Le reste du code d'analyse contenu dans l'article peut alors
être exécuté.
- Ici, comme on prépare un article, il est essentiel de pouvoir cacher
certaines sections et d'avoir un contrôle complet sur la typographie
car on n'a jamais assez de place.
- Dans tous les cas, tout ceci n'est possible que si on a suffisemment
de matière, c'est-à-dire que si on a pris régulièrement des notes
sur comment on a obtenu les données et sur comment on les a
analysées. C'est ce que vous mettrez en pratique dans le module 3
avec l'outil de votre choix.
** Différences techniques
| | Origine | Technologie | Utilisation | Navigation | Format | Article? |
|---------------+-----------+--------------------+---------------+------------+--------+-----------|
| Jupyter | 2001 | Web App., Python | Facile | Limitée | JSON | Difficile |
| Rstudio/knitr | 2011/2014 | IDE, Java/R | Facile | Limitée | Rmd | Oui |
| Org-Mode | 1976/2008 | Editeur, EmacsLisp | Plus complexe | Puissante | Org | Oui |
L'outil importe peu, ce qui importe, c'est :
- collecter l'information
- l'organiser et la rendre exploitable
- la rendre disponible
Note:
- L'écosystème évolue mais vous pouvez déjà vous en saisir.
** Bonus : expériences vécues
- Complétion, introspection donc développement/composition pas si
désagréable comparé à un IDE avancé.
- Objectif atteint. Mois par mois : permet aux collègues d'aider,
d'avancer ensemble, etc. Communication de "problèmes" (données
manquantes par exemple) bien plus simple.
- Un document dynamique et traçable, réexecutable, modifiable,
réutilisable, ... Quand le reviewer 3 demande de refaire la figure 5
en noir et blanc et de changer les légendes. Ou bien de rajouter de
la compléter.
- Au jour le jour : meilleur réutilisation (par exemple entre l'article
et le slide)
Éléments clés lors du choix :
- Simplicité de prise en main vs. vrai éditeur
- Où sont fait les calculs
- Multi-langage
- http://carreau.github.io/posts/23-Cross-Language-Integration.html
- Gestion des langages compilés
- Notions de caches et d'état
Les principaux outils actuels :
- jupyter
- rstudio
- org-mode
Limitations :
- Longs calculs
- Grands documents
- Solutions wysiwyg pour jupyter
Historique/diff un peu compliqué pour jupyter
#+TITLE: Entering Behind the Scenes: Computational Documents
#+AUTHOR: @@latex:{\large Arnaud Legrand} \\ \vspace{0.2cm}LIG, Univ. Grenoble Alpes, CNRS, Inria\\ \vspace{0.2cm} \texttt{arnaud.legrand@imag.fr}@@
#+LATEX_CLASS: beamer
#+LATEX_CLASS_OPTIONS: [presentation,bigger]
#+STARTUP: beamer indent
#+LANGUAGE: fr
#+PROPERTY: header-args :eval no-export
#+OPTIONS: H:2 tags:nil
#+OPTIONS: num:t toc:nil \n:nil @:t ::t |:t ^:nil -:t f:t *:t <:t
#+OPTIONS: TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-toc
# #+OPTIONS: author:nil email:nil creator:nil timestamp:t
#+TAGS: noexport(n)
#+EXCLUDE_TAGS: noexport
#+LATEX_HEADER: \usepackage[normalem]{ulem}
#+LATEX_HEADER: \usepackage{svg}
#+LATEX_HEADER: \setbeamercovered{invisible}
#+LATEX_HEADER: \AtBeginSection[]{\begin{frame}<beamer>\frametitle{Where are we?}\tableofcontents[currentsection]\end{frame}}
#+LATEX_HEADER: \beamertemplatenavigationsymbolsempty
#+LATEX_HEADER: \usepackage{tikzsymbols}
#+LATEX_HEADER: \def\smiley{\Smiley[1][green!80!white]}
#+LATEX_HEADER: \def\frowny{\Sadey[1][red!80!white]}
#+LATEX_HEADER: \def\winkey{\Winkey[1][yellow]}
#+LATEX_HEADER: \usepackage{color,soul}
#+LATEX_HEADER: \definecolor{lightblue}{rgb}{1,.9,.7}
#+LATEX_HEADER: \sethlcolor{lightblue}
#+LATEX_HEADER: \newcommand{\muuline}[1]{\SoulColor\hl{#1}}
#+LATEX_HEADER: \makeatletter
#+LATEX_HEADER: \newcommand\SoulColor{%
#+LATEX_HEADER: \let\set@color\beamerorig@set@color
#+LATEX_HEADER: \let\reset@color\beamerorig@reset@color}
#+LATEX_HEADER: \makeatother
#+LATEX_HEADER: \let\hrefold=\href
#+LATEX_HEADER: \renewcommand{\href}[2]{\hrefold{#1}{\SoulColor\hl{#2}}}
#+LaTeX: \let\alert=\structure % to make sure the org * * works
#+LaTeX: \begin{frame}{Outline}\tableofcontents\end{frame}
* M2-S0: Computational Documents
** Entering Behind the Scenes: Computational Documents
\vspace{-1cm}
\begin{flushright}
\includegraphics[width=7cm]{img/phd010708.png}
\end{flushright}
\vspace{-1cm}
1. A few Recent Controversial Studies
2. Why is This so Difficult?
3. Computational Document: Principles
4. Hands on.
- Jupyter
- Rstudio
- Org-Mode
5. Collaborating
6. Comparative study
# Note:
# Pour vous convaincre de l'importance de cette traçabilité, je vais
# commencer par vous présenter quelques exemples récents de travaux dont
# les résultats ont été particulièrement controversés et discutés. Ils
# illustrent à quel point la capacité à pouvoir inspecter les méthodes
# utilisées pour produire tel ou tel résultat est essentielle.
# Comme nous le verrons, la plupart des problèmes rencontrés sont liées
# au calcul, qu'il s'agisse d'erreurs de programmations, de
# transformations de données peu rigoureuses, ou bien de procédures
# statistiques discutables.
# Une fois les origines de tous ces problèmes identifiées, je vous
# présenterai rapidement quelles bonnes pratiques mettre en oeuvre afin
# de les éviter.
# En particulier, je vous expliquerai ce que c'est que ce fameux
# document computationnel: un document qui permet de présenter
# agréablement des résultats à d'autres (ce que j'appelle la vitrine)
# mais aussi d'accéder à l'ensemble des calculs sous-jacents (ce que
# j'appelle l'envers du décor).
# Il existe plusieurs formats de tels documents et nous vous proposons
# trois environnements permettant d'en produire facilement. Ces trois
# environnements se distinguent par le niveau de technicité nécessaire à
# leur mise en oeuvre. À vous de choisir celui qui vous convient le
# mieux quitte à en essayer un autre plus tard.
# Jupyter, le premier, a été intégré au MOOC et au gitlab et ne
# nécessite donc aucune installation de votre part. C'est donc le plus
# simple à mettre en oeuvre. L'ensemble des données et des calculs sera
# hébergé sur nos serveurs, mais vous pourrez y accéder et les récupérer
# sur votre propre ordinateur à tout moment via le gitlab si vous le
# souhaitez. Jupyter vous permettra de gérer des notebooks et d'utiliser
# le langage python3 ou bien le langage R.
# Rstudio, le second, est un environnement de développement spécifique
# au langage R. Il vous faudra l'installer sur votre machine et
# synchroniser vos productions avec le gitlab. C'est un logiciel très
# bien maintenu, qui fonctionne aussi bien sous linux et mac que sous
# windows et son installation ne devrait pas poser de difficulté
# particulière. Si vous êtes déjà familier avec le langage R, c'est
# l'option que je vous recommande. L'avantage de cette approche est que
# vous aurez à la fin du MOOC sur votre machine un environnement de
# travail directement prêt à l'emploi. Avec Rstudio, il est également
# possible d'utiliser occasionnellement du code python mais si vous avez
# l'intention de faire principalement du python, il vaut mieux utiliser
# jupyter.
# Enfin, OrgMode, est clairement celui qui est le plus délicat à mettre
# en oeuvre mais c'est aussi celui que Konrad, Christophe et moi-même
# utilisons quotidiennement aussi bien pour gérer notre cahier de
# laboratoire que pour rédiger des articles ou des notes
# techniques. Nous nous sommes donc dit qu'il pouvait être intéressant
# de vous le présenter. OrgMode nécessite l'installation d'Emacs, un
# éditeur de texte qui révèle toute sa puissance dans un environnement
# linux ou mac. Il permet de combiner très efficacement différents
# langages et est par certains aspects moins limité que les deux
# précédents. Cette option est à réserver à un public averti mais le jeu
# en vaut la chandelle.
# Une fois familiarisé avec un de ces environnements, nous vous
# proposerons une petite séance pratique dont l'objectif sera de
# produire un petit document computationnel.
# Les dernières séquences peuvent être visionnées indépendemment et
# traitent de sujets un peu plus techniques, en particulier de comment
# utiliser de tels outils avec vos co-auteurs qui peuvent avoir leurs
# propres habitudes, ou de comment produire des documents avec un style
# bien spécifique.
# Nous concluons enfin ce module avec une comparaison de ces différents
# outils et une présentation des bénéfices d'une utilisation
# quotidienne.
* M2-S1: A few Recent Controversial Studies
** Entering Behind the Scenes: Computational Documents
1. *A few Recent Controversial Studies*
2. Why is This so Difficult?
3. Computational Document: Principles
4. Hands on.
- Jupyter
- Rstudio
- Org-Mode
5. Collaborating
6. Comparative study
** A Few Recent Controversial Studies
file:img/in_science_we_trust.jpg
# Note:
# Je vous avais promis quelques exemples récents de travaux dont les
# résultats ont été particulièrement controversés et discutés. C'est ce
# que je vais vous présenter dans cette séquence.
** Economy: Austerity in Fiscal Policy (1/2)
*** 2010
# - /gross debt [..] exceeding 90 percent of the economy has a
# significant negative effect on economic growth/
#+BEGIN_QUOTE
gross external debt reaches 60 percent of GDP, a country's annual
growth declined by two percent
[..]for levels of external debt in excess of 90 percent, GDP growth
was roughly cut in half
\flushright -- [[https://en.wikipedia.org/wiki/Growth_in_a_Time_of_Debt][Reinhart et Rogoff]]: /Growth in a Time of Debt/
#+END_QUOTE
# - données non publiées mais disponibles sur demande
# Note:
# Commençons par des travaux en économie. 2007: crise des subprimes aux
# États-Unis. De 2008 à 2009, deux économistes prestigieux, Carmen
# Reinhart et Kenneth Rogoff présentent leurs travaux et annoncent que
# la crise financière est loin d'avoir produite toutes ses
# conséquences. En 2010, ils publient un article intitulé "Growth in a
# Time of debt" qui étudie le lien entre dette et croissance.
# Leurs principales conclusions sont que lorsque lorsque la dette
# extérieure d'un pays dépasse 90% du PIB, les conséquences sur la
# croissance sont dramatiques.
# De nombreux politiciens, journalistes et activistes s'appuient sur cet
# article pour soutenir la mise en place de politiques d'austérité
# budgétaire.
** Economy: Austerity in Fiscal Policy (2/2)
*** 2013
# - Herndon, Ash and Pollin: /While using RR's working spreadsheet, we
# identified *coding errors*, *selective exclusion* of/ /available data,
# and *unconventional* weighting of summary *statistics*./
#+BEGIN_QUOTE
While using RR's working spreadsheet, we identified *coding errors*,
*selective exclusion* of available data,
and *unconventional* weighting of summary *statistics*.
\flushright -- Herndon, Ash et Pollin
#+END_QUOTE
# #+BEGIN_EXPORT html
# <br/>
# #+END_EXPORT
# - Wray: /combining data across centuries, exchange rate regimes,
# public and private/ /debt, and debt denominated in foreign currency
# as well as domestic currency/
#+BEGIN_QUOTE
combining data across centuries, exchange rate regimes, public and
private debt, and debt denominated in foreign currency as well as
domestic currency.
\flushright -- Wray
#+END_QUOTE
# Note:
# Ces seuils de 90% ainsi que l'ampleur des conséquences sont très
# discutés, d'autant plus que certains chercheurs échouent à obtenir des
# résultats similaires en utilisant les données disponibles
# publiquement. Ils demandent donc à Reinhart et Rogoff l'ensemble des
# données et des feuilles de calculs utilisées dans l'étude et ces
# derniers finissent par leur fournir.
# Dans ces feuilles, des erreurs de calcul évidentes apparaissent
# rapidement ainsi que des traitement de données assez douteux
# (exclusion de données, pondérations suspectes, etc.).
# Reinhart et Rogoff répondent point par point en expliquant que ces
# quelques erreurs ne changent rien au résultat final, que leur façon de
# calculer les statistiques sont tout à fait standard.
# En fait, une fois les détails révélés, pour beaucoup de chercheurs ces
# calculs n'ont pas beaucoup de sens, les valeurs utilisées sont très
# discutables, et il est malhonnête d'utiliser ces travaux pour
# justifier une politique d'austérité budgétaire.
# Mais le mal est fait. Pendant plus de trois ans, l'austérité n'est pas
# présentée comme un choix mais comme une nécessité. Et quand bien même
# l'article original est considéré comme non pertinent par les
# économistes, ces idées ont fait leur chemin et sont difficiles à
# détrôner.
# Au delà du caractère idéologique de ce genre de travaux, une des
# raisons pour lesquelles ce débat a mis autant de temps à avoir lieu
# est lié à la non publication de l'ensemble des procédures de calcul et
# des données utilisées, pratique courante en économie. Sous les feux
# de la rampe, les auteurs ont bien été forcés de mettre à disposition
# ce qui sous-tendait leur travaux mais sans pression médiatique
# particulière, en général, rien ne se passe...
** Functional MRI
# file:assets/img/Irmf.jpg&size=cover
- 2010: [[https://www.researchgate.net/publication/255651552_Neural_correlates_of_interspecies_perspective_taking_in_the_post-mortem_Atlantic_Salmon_an_argument_for_multiple_comparisons_correction][Bennett et al. and the dead salmon]] $\smiley$
- 2016: [[http://www.pnas.org/content/113/28/7900.abstract][Eklund, Nichols, and Knutsson]]. [[http://www.sciencealert.com/a-bug-in-fmri-software-could-invalidate-decades-of-brain-research-scientists-discover][A bug in fmri software could
invalidate 15 years of brain research]] \newline (/40 000 articles/)
- 2016: But it's [[https://www.cogneurosociety.org/debunking-the-myth-that-fmri-studies-are-invalid/][more subtle than it looks like]]. [[http://blogs.warwick.ac.uk/nichols/entry/bibliometrics_of_cluster/][Nichols]].\newline /\approx 3 600
impacted studies/
Statistical methods and methodology should be improved but no
fundamental invalidation
file:img/Researcher-test.jpg
# Note:
# Continuons avec un autre exemple: l'imagerie cérébrale, qui permet
# d'observer l'activité du cerveau d'un individu lorsqu'il effectue une
# tâche cognitive et ainsi de mieux comprendre la structure et le
# fonctionnement du cerveau. L'IRM fonctionnelle est l'une de ces
# techniques et mesure de très faibles variations locales du taux
# d'oxygénation du sang dans le cerveau.
# En 2010, Craig Bennett et ses encadrants ont une idée saugrenue. Ils
# placent un saumon mort dans un appareil d'IRM et lui présentent des
# images. Étonnamment, ils observent des signes d'activité cérébrale, ce qui est
# pour le moins surprenant puisque le saumon est bel et bien mort. Aussi
# drôle que cela puisse paraître, Bennett et ses encadrants savent très
# bien ce qu'ils font. Les données brutes obtenues lors d'une IRM sont
# très bruitées et toute une série de calculs et de tests statistiques
# sont appliqués pour transformer ces données en images
# intelligibles. Mais il arrive que le bruit soit trop important, que la
# machine soit mal calibrée, que la procédure de calcul soit inadaptée
# et que des signaux apparaissent fortuitement.
# Leur article rédigé avec un ton très humoristique fait sensation car
# il met le doigt sur des faiblesses méthodologiques.
# L'an dernier, des collègues me sachant intéressé par ces problèmes de
# réplication me font suivre un article récent assez alarmant. Cet article présente un
# problème dans les procédures statistiques utilisées dans les logiciels
# d'analyse d'IRMf les plus courants, ce qui remet potentiellement en
# cause les résultats obtenus ces quinze dernières années. Étant donnée
# l'ampleur de l'erreur, les auteurs concluent que 40,000 articles
# pourraient être concernés. De plus, les données étant très
# volumineuses dans ce domaine, elles ne sont pas archivées et il ne
# sera pas possible de simplement les réanalyser. L'ensemble des
# expériences seraient à refaire...
# En fait, suite aux retours qui leurs sont faits, les auteurs revoient
# rapidement à la baisse leurs estimations assez alarmistes.
# Au final, le problème méthodologique et la capacité à vérifier les
# études suite à des erreurs de calcul reste entier même s'il ne remet
# pas pour autant en cause l'ensemble des résultats obtenus ces
# dernières années.
** Incorrect Protein Structures
#+LaTeX: \begin{columns}\begin{column}{6.3cm}
*Geoffrey Chang*: study the tertiary structures of membrane proteins of
multidrug resistant bacteria
\small MsbA de Escherichia Coli (Science, 2001), Vibrio cholera
(Mol. Biology, 2003), Salmonella typhimurium (Science, 2005)
#+LaTeX: \end{column}\begin{column}{3.5cm}
#+LaTeX: \hspace{-.3\linewidth}\includegraphics[width=1.2\linewidth]{img/flipping_fiasco.png}
#+LaTeX: \end{column}\end{columns}\medskip
*2006*: Inconsistencies, alerts, then 5 retractions
#+BEGIN_QUOTE
a homemade data-analysis program had flipped
two columns of data, inverting the electron-density map from which his
team had derived the protein structure.
\flushright -- [[https://people.ligo-wa.caltech.edu/~michael.landry/calibration/S5/getsignright.pdf][a "buggy software"]]
#+END_QUOTE
# Note:
# Un dernier exemple, cette fois-ci en cristallographie.
# Geoffray Chang est un chercheur à la trajectoire fulgurante,
# récompensé par de nombreux prix. Son équipe, basée au Scripps
# Institute à l'Université de Californie San Diego, a publié une série
# d'articles dans des revues prestigieuses et détaillant la structure de
# certaines protéines présentes dans les membranes de cellules. Ces
# protéines jouent un rôle essentiel dans la résistance de ces bactéries
# à certains médicaments et connaître leur structure est une étape
# importante dans la compréhension de leur fonctionnement.
# Hélas, peu de temps après, d'autres équipes de chercheurs qui étudient
# des protéines très similaires rapportent des structures anormalement
# différentes de celles publiées par Chang et son équipe. En lisant ces
# travaux Chang, horrifié, remonte vite à la source du problème.
# Un des codes d'analyse aurait inversé deux
# colonnes de données et ainsi inversé la répartition de la densité
# d'électrons à partir de laquelle la structure finale de la protéine
# est calculée. D'après Chang, ce code aurait été hérité d'un autre
# laboratoire et s'était également répandu depuis dans d'autres équipes.
# Même si toute l'acquisition des données avait été faite soigneusement,
# ce n'était pas le cas de l'analyse et ce petit grain de sable a
# conduit à la rétractation immédiate de 5 articles par Chang et son
# équipe. Ces publications ont eu un impact énorme sur la communauté, à
# tel point que plusieurs années après la rétractation, les résultats
# contradictoires avec ceux de Chang paraissaient suspects avaient du
# mal à être publiés.
** Loosing Faith?
#+LaTeX: \begin{columns}\begin{column}{6.8cm}
- [[http://www.nature.com/nrd/journal/v10/n9/full/nrd3439-c1.html?foxtrotcallback=true][Oncology]]: "/half of published studies, even in prestigious journals,
can't be reproduced in industrial labs/"
- [[http://theconversation.com/we-found-only-one-third-of-published-psychology-research-is-reliable-now-what-46596][Psychology]]: "/attempting to reproduce 100 previously published
findings/, /only one-third of published psychology research was found
to be reliable/"
#+LaTeX: \end{column}\begin{column}{3.5cm}
#+LaTeX: \hspace{-.1\linewidth}\includegraphics[width=1\linewidth]{img/in_science_we_trust_small.jpg}
#+LaTeX: \end{column}\end{columns}\medskip
#+BEGIN_CENTER
*Whistle blowers* or
*dysfunctional institutions*?
#+END_CENTER
*** _Questioning_ is part of the scientific processus\pause
*** Just like _rigor_ and _transparency_...
# Note:
# Il n'y a à ce jour pas un domaine des science qui ne soit épargné par
# ces difficultés à reproduire les travaux publiés. En oncologie, un
# article récemment publié rapporte que plus de la moitié des études
# publiées ne peuvent être reproduites en laboratoire industriel, et ce
# même si les études sont publiées dans des journaux prestigieux.
# En psychologie, les capacités à reproduire les résultats publiés sont
# également très basses.
# Le problème est méthodologique mais également certainement
# sociologique, lié à une pression productiviste trop importante. Mais
# attention aussi à ne pas donner non plus trop d'importance aux signaux
# d'alertes que nous venons de voir...
# Le problème est compliqué mais il faut garder à l'esprit que la remise
# en cause fait partie du processus scientifique. Il n'est donc pas
# surprenant que de telles difficultés de reproduction de travaux
# scientifiques soit présentes.
# Cependant, deux autres caractéristiques essentielles du processus
# scientifique sont la rigueur et la transparence et il est clair que
# dans l'ensemble des cas que nous venons de voir il manquait souvent
# l'un et l'autre...
* M2-S2: Why is This so Difficult?
** Entering Behind the Scenes: Computational Documents
1. A few Recent Controversial Studies
2. *Why is This so Difficult?*
3. Computational Document: Principles
4. Hands on.
- Jupyter
- Rstudio
- Org-Mode
5. Collaborating
6. Comparative study
** Why is This so Difficult?
file:img/box-she-s-told-not-to-open-in-it-the-gods-had-placed-all-the-evils-9vbl9q-clipart.jpg
# Note: Comme nous l'avons vu, reproduire les travaux de recherche, même
# publiés dans des revues prestigieuses est souvent assez
# difficile. Dans cette séquence, nous allons identifier les difficultés
# les plus communes.
** 1) Information Scarcity
Clearly indicate:
+ *Provenance* and *data*
#+BEGIN_CENTER
/Unavailable data = hardly verifiable results/
#+END_CENTER
+ *Decisions*
#+BEGIN_CENTER
/Unexplained Decision = Suspicious Choice/
#+END_CENTER
#+LaTeX: \bigskip
*** Laboratory Notebooks may help
# Note: La première source de difficultés rencontrées lors de tentatives
# de reproduction est tout simplement le manque d'informations.
# Si on ne prend pas soin d'expliciter comment on a obtenu nos données
# et qu'on les garde secrètes, il est certain qu'il va être difficile
# pour une tierce personne de vérifier si elle arrive aux mêmes
# conclusions ou pas.
# # C'est étrange car mettre les données utilisées à disposition permet au
# # lecteur d'en évaluer la qualité (voire d'y trouver des erreurs). Sans
# # cette évaluation, difficile pour le lecteur de savoir quelle confiance
# # avoir dans les conclusions de l'article.
# De même expliciter les choix effectués à chacune des étapes de l'étude
# s'avère essentiel. Quel protocole expérimental a été choisi et
# pourquoi ? Quelles données ont été conservées ? Quelles données ont
# été soigneusement écartées et pourquoi ? Quelle procédure statistique
# a été utilisée et les hypothèses sous-jacentes étaient elles
# raisonnables ? Etc.
# Après tout, on doit toujours faire des choix à un moment donné. Mais
# ne pas expliquer ces choix, même en étant rigoureux et de bonne foi,
# c'est prendre le risque que les lecteurs deviennent
# suspicieux. D'autre part, être totalement transparent sur ces choix,
# c'est permettre à d'autres (ou à vous-même) de décider s'il est
# nécessaire de revenir dessus ou pas
# Pour garder trace de tous ces choix et des informations sur ces
# données, le cahier de laboratoire un outil essentiel. Encore faut-il
# ensuite mettre ces informations à disposition, mais nous reviendrons
# sur ce point par la suite.
** 2) Computers [[http://theconversation.com/how-computers-broke-science-and-what-we-can-do-to-fix-it-49938][broke science]]
- *Point and click*:
- *Spreadsheets*: [[https://qz.com/768334/years-of-genomics-research-is-riddled-with-errors-thanks-to-a-bunch-of-botched-excel-spreadsheets/][programming and data manipulation mistakes]]
-
~Membrane-Associated Ring Finger (C3HC4) 1, E3 Ubiquitin Protein
Ligase~ \to ~MARCH1~ \to 2016-03-01 \to 1456786800
-
~2310009E13~ \to 2.31E+19
- *Complex software stack*
- *Bug*: /Coding is a difficult task!/
# Note:
# La deuxième source de difficultés rencontrées lors de tentatives
# de reproduction de travaux est tout simplement les erreurs induites
# par l'utilisation effrénée des ordinateurs.
# Comme toute innovation technologique, les ordinateurs nous permettent
# d'aller plus vite, plus loin mais aussi de faire des erreurs plus
# facilement et plus rapidement...
# Au premier plan des sources d'erreurs, ces logiciels intuitifs où
# l'interaction se fait à la souris et qui ne permettent pas
# d'expliciter ce qui est calculé et à partir de quoi. Leur simplicité
# d'utilisation incite à les utiliser pour tout, même pour ce pour quoi
# ça n'est pas vraiment prévu.
# Il est par exemple très difficile de comprendre la logique du calcul
# ayant lieu dans une feuille excel pleine de macros. Bien sûr, il est
# possible de gérer des stocks et la comptabilité d'une entreprise avec
# un tableur, mais ceux qui ont déjà eu à faire à ce genre
# d'abominations savent qu'un ERP permet d'éviter bien des soucis. Et
# bien de la même façon, un tableur n'est pas le bon outil pour faire
# des statistiques ou du traitement de données !
# Tenez, quelques exemples d'anecdotes effroyables liées à l'utilisation
# d'un tableur. En génomique, il est bien pratique de donner des petits
# noms aux gènes tels que celui-ci. Celui-ci, c'est MARCH1. Seulement
# pas mal de tableurs croient bien faire en l'interprétant
# comme une date et par effet de bord comme le nombre de secondes
# écoulées depuis le 1er janvier 1970... L'identifiant de gène 231 000
# 9E13 se retrouve lui aussi fréquemment convertit en nombre. Alors bien
# sûr, il n'y a peut-être qu'une vingtaine de gènes concernés par ce
# genre de problème sur les 30,000 du génome humain, mais c'est quand
# même assez désagréable.
# De manière générale, il est courant de se reposer sur une pile
# logicielle complexe. Complexe et souvent mal maîtrisée. Combien
# d'études reposent ainsi sur des logiciels propriétaires, sortes de
# boites noires dont on ne maîtrise pas le contenu et qui appliquent
# aveuglement des procédures de calculs et de transformations de
# données?
# # - l'utilisation de telle ou telle méthode plutôt qu'une autre est
# # souvent discutable
# Alors, je ne suis pas en train de dire qu'il faut tout reprogrammer
# soi même. Ce n'est bien sûr par la meilleure façon d'échapper aux
# bugs. Dans les cas de l'étude Reinhart et Rogoff ou des fausses
# structures de protéines de Chang, les erreurs venaient de programmes
# maisons.
# Mais il me semble essentiel d'être en mesure de déterminer dans son
# analyse si chacune des briques est digne de confiance ou pas. Et si
# l'un des composants, par sa nature, l'interdit, il faut sérieusement
# songer à le remplacer.
** Are Computers the Only Ones to Blame?
*Lack of rigor and organization*
- No backup
- No history
- No quality control
# Note:
# Enfin, la dernière cause méthodologique de non-reproductibilité et
# source d'erreurs est certainement le mangue de rigueur et
# d'organisation.
# Même si le stockage ne coûte plus rien de nos jours, la sauvegarde des
# données est souvent mal assurée et il est courant d'en perdre suite à
# une mauvaise manipulation, ou bien à la suppression de son compte
# informatique lors du passage d'une institution à une autre.
# En l'absence de mécanisme de gestion de version, il est courant
# de remplacer par inadvertance d'anciennes données par de nouvelles et
# de ne plus arriver à accéder à d'anciennes observations.
# Dans un certain nombre de domaines, l'utilisation de plans
# d'expériences randomisés ou de pré-études (study pre-registration),
# n'est absolument pas systématique. De même les bonnes pratiques de
# développement logiciel comme la revue de code ou l'intégration
# continue sont encore rarement appliqués au logiciels utilisés dans la
# recherche.
** Social and Cultural Causes
#+BEGIN_QUOTE
\centering Article = _simplified_ version of the procedure
#+END_QUOTE
#+LaTeX: \bigskip
#+BEGIN_QUOTE
\centering
*Tracing* all these information and *making them available* =
substantial investment
#+END_QUOTE
#+LaTeX: \bigskip
If no one requires/inspect such information, why should I worry?
# Note:
# Enfin, il serait naïf de ne pas évoquer la dimension culturelle et
# sociale du problème.
# Un article est une version simplifiée et intelligible des
# résultats. Certains diraient même la publicité... Une description de
# haut niveau est essentielle car elle permet de prendre du recul mais
# elle est devenue la norme alors que la technicité de la recherche
# actuelle est telle qu'il est clairement impossible de donner dans un
# document de 8 à 10 pages toutes les informations permettant de refaire
# les expériences et les analyses.
# - La description du protocole expérimental est souvent succincte
# - Les données sont généralement bien trop nombreuses pour être données
# in extenso et sont résumées à travers quelques courbes.
# - Les traitements statistiques appliqués pour parvenir à ces courbes
# ne sont décrits que rapidement.
# Alors, bien sûr il est possible de tracer toutes ces informations et
# de les mettre à disposition. À ceci près que cela demande du temps,
# voire beaucoup de temps si on ne dispose pas des bons outils.
# # - sans compter que mettre à disposition toutes ces informations, alors
# # qu'on a soi-même peiné à les obtenir, c'est permettre à d'autres de
# # récupérer les fruits de notre travail sans efforts.
# Mais si personne n'exige ces informations, à quoi bon s'embêter ?
** Going Public?
- Weaknesses would become obvious
- Someone may find a flaw
- Someone may [[http://www.nature.com/news/the-top-100-papers-1.16224][benefit from my hard work]]
- /Data may be sensitive/
# sécurité, machine learning pour la police
Let us give ourselves the means to have everything inspectable on
demand.
# Note:
# Mais donner accès, mettre à disposition, cela veut dire tout rendre
# public ? N'est-ce pas un peu radical ? Et risqué ? Démontons ensemble
# quelques idées reçues.
# Si je donne accès à tout ce que j'ai fait, il deviendra alors évident
# que ce que j'ai fait n'est pas aussi parfait que ce que je prétends,
# que c'est un peu sale et pas toujours très rigoureux, que j'ai
# sélectionné les résultats que je présente.
# - C'est sûr. En même temps, c'est la réalité et vous auriez tort de
# croire que vous êtes le seul dans cette situation. Si ça se trouve,
# vous travaillez mieux que les autres et dans un domaine où la
# réputation est essentielle, vous avez probablement plutôt intérêt à
# le montrer. Pire, si vous le cachez, cela finira par paraître
# suspicieux.
# Vous me direz qu'en révélant tout, je prend le risque que quelqu'un
# trouve une erreur et de passer pour un imbécile.
# - C'est certain, mais tout le monde fait des erreurs, même les plus
# grands. Et en ce qui me concerne, je préfère que quelqu'un trouve
# une erreur et m'aide à la corriger afin que mes travaux deviennent
# corrects.
# Oui, mais quelqu'un pourrait tirer parti, réanalyser ces données que
# j'ai eu tant de mal à obtenir, ou simplement utiliser ce code que j'ai
# eu tant de mal à écrire et faire trois ou quatre papiers là où je n'ai
# eu le temps d'en faire qu'un.
# - Alors d'abord, si quelqu'un réutilise votre travail, il se doit de
# le citer correctement et de vous rendre le crédit qui vous est
# dû. Ensuite les articles les plus cités de tous les temps sont des
# articles présentant des contributions méthodologiques ou du logiciel
# qui sont devenus essentiels dans un domaine.
# Une petite parenthèse: ceux d'entre vous qui connaissent github,
# savent que cette plate-forme est à mi-chemin entre la plate-forme de
# développement logiciel et le réseau social. Les contributions d'un
# développeur à différents projets sont visibles ainsi que la
# fréquence de ses contributions, ce qui permet à un jeune développeur
# de se faire une carte de visite infalsifiable et
# ultra-visible. Montrer ce que l'on fait est une façon efficace
# d'atteindre une certaine forme de reconnaissance par la
# communauté. Mettre ses travaux à disposition de tous est
# probablement la meilleure façon de démontrer sa propriété
# intellectuelle.
# Enfin, il est possible que les données soient sensibles et ne puissent
# être divulguées sans prendre le risque de causer du tort à des
# gens. Par exemple, s'il s'agit de données médicales, de données
# judiciaires, d'informations sur des enfants ou sur des intentions de
# vote, etc.
# - Dans ce type de situation où les travaux ont une dimension éthique,
# il convient de définir quelles personnes peuvent avoir accès aux
# informations pour les vérifier ou les réutiliser. Ensuite, il existe
# des techniques cryptographiques assez faciles d'accès permettant de
# s'assurer que seulement les personnes habilitées peuvent accéder aux
# données.
# Dans tous les cas, même si au final ces informations sont
# semi-publiques, il est essentiel de se donner les moyens de permettre
# à autrui d'inspecter ce que nous avons fait.
** Tools to Avoid and Possible Alternatives
- *Proprietary tools, formats and services*
1. +Excel, Word, Evernote+
- Markdown, Org-mode, CSV, HDF5, ...
2. +SAS, Minitab, matlab, mathematica, ...+
- Scilab, R, Python, ...
3. +Dropbox, online proprietary lab. notebooks , ...+
- Framadrop, GitLab/GitHub, ...
- *"Intuitive" Tools *
- +spreadsheet, graphical interfaces, interactive exploration+
- learn self control and slow down... $\smiley$
- R, Python, ...
# Note:
# Et pour permettre l'inspection, il faut utiliser les bons outils
# Cela commence par banir autant que possible les logiciels et les
# formats propriétaires. Bien sûr, ces outils sont bien faits et vous y
# êtes habitués mais on en est également captif et les entreprises qui
# les développement n'offrent aucune garantie sur le long terme. Je suis
# sûr que ces mises à jours automatiques vous agacent vous aussi. :)
# L'expérience montre qu'il est hélas très courant de perdre des données
# et des informations lors de ces mises à jour.
# Alors, soyons honnête, l'utilisation de logiciel libre ne vous protège
# absolument pas de ce genre de mauvaises surprises. Mais comme vous
# avez accès librement à l'ensemble des versions, les chances d'arriver
# à récupérer vos données sont quand même bien plus élevées. De même
# l'adoption de formats textes simples et ouverts augmente vos chances
# d'arriver à les relire avec d'autres logiciels.
# En ce qui me concerne, à chaque fois que j'ai utilisé un format
# binaire ou pas bien ouvert, j'ai fini par perdre des données. Cela
# fait donc 10 ans que je n'utilise plus que des formats texte ou des
# standards binaires ouverts et le problème ne s'est plus jamais posé,
# et ce malgré les mises à jours logicielles très régulières de ma
# machine.
# Donc règle numéro 1: utiliser autant que possible du format texte
# (markdown, orgmode pour vos notes, csv pour vos données).
# Règle numéro 2: utiliser autant que possible les logiciels et les
# langages de programmation libres comme R ou python.
# Et Règle numéro 3: éviter de stocker vos données chez un hébergeur
# dont vous pourriez être captif.
# En effet, les services gratuits (ou pas) et très intégrés sont
# tentants mais correspondent à un business plan particulier qui peut se
# révéler incompatible avec vos besoins futurs, ne pas être pérenne et
# ne vous donne pas forcément les garanties de confidentialité que vous
# souhaiteriez.
# Enfin, attention aux tableurs et outils graphiques qui peuvent vous
# donner au premier abord l'impression d'une meilleur efficacité et
# productivité mais qui sur le long terme ne vous permettent pas
# d'atteindre la traçabilité et l'inspectabilité que vous souhaiteriez.
# C'est plus difficile, en particulier au début, mais en utilisant des
# langages comme R ou python, passé la première marche, on gagne
# rapidement en puissance et en efficacité.
** Conséquences :noexport:
- Des *erreurs*...
- Des *difficultés* certaines à *réutiliser* le travail des autres, voire
son propre travail
- Un *doute* dommageable pour tout le monde (auteur, détracteurs,
lecteur, décideur...)
# Note:
# C'est pour toutes ces raisons que les résultats de recherche
# contiennent parfois des erreurs et sont si difficile à répliquer et à
# réutiliser, même au sein d'une même équipe.
# Les doutes que cela engendre sont dommageable pour tout le
# monde. Lorsque l'on propose un résultat, il n'est pas agréable d'être
# soupçonné de fraude ou d'incompétence. En même temps, les détracteurs
# d'un résultat apparaissent comme de simples aigris ou au contraire
# comme des lanceurs d'alertes selon le contexte alors qu'il est normal
# de questionner un résultat et d'avoir un débat apaisé et rationnel à
# son sujet.
# Face à ces problèmes, il me semble que la meilleur attitude à avoir
# est celle de la transparence: Expliciter augmente les chances de
# trouver les erreurs et de les éliminer.
# C'est d'ailleurs une demande de plus en plus pressante de la part
# de la société civile afin d'éviter les dérives et d'améliorer
# l'efficacité de nos travaux.
** Paradigm Shift
1. Information scarcity, difficulties in accessing data
2. Computation mistakes
3. Lack of scientific and technical rigor
#+LaTeX: \begin{center}\includegraphics[height=2.5cm]{img/in_science_we_trust_small.jpg}
#+LaTeX: \includegraphics[height=2.5cm]{img/in_code_we_trust.jpg}\end{center}
*** Making everything explicit increases the chances of finding and getting rid of mistakes
# Demande de *traçabilité* de plus en plus pressante de la société, des
# institutions, de l'Europe, ...
# Note:
# Nous avons vu que la première cause d'échec de reproduction de
# résultats scientifiques est tout simplement le manque d'information,
# la non disponibilité des données ou des procédures appliquées. Cela ne
# signifie pas que le résultat soit faux mais cela empêche de le
# vérifier et de s'appuyer dessus.
# La seconde cause d'échec est tout simplement l'erreur de calcul qui
# peut se glisser n'importe où.
# De manière générale, le manque de rigueur scientifique et technique
# est souvent à l'origine de ces deux problèmes.
# Il me semble que la meilleur attitude à avoir est celle de la
# transparence: Expliciter augmente les chances de trouver les erreurs
# et de les éliminer. C'est pour cela que nous assistons ces dernières
# années à un changement de paradigme de recherche et que l'on exige un
# accès à l'ensemble des données et des procédures de calcul.
# C'est d'ailleurs une demande de plus en plus pressante de la part de
# la société civile (en particulier le Conseil Européen) afin d'éviter
# les dérives et d'améliorer l'efficacité de nos travaux.
* M2-S3: Computational Documents: Principles
** Entering Behind the Scenes: Computational Documents
1. A few Recent Controversial Studies
2. Why is This so Difficult?
3. *Computational Document: Principles*
4. Hands on.
- Jupyter
- Rstudio
- Org-Mode
5. Collaborating
6. Comparative study
** Computational Documents: Principles
file:img/iceberg.jpg
# Note:
# Dans cette séquence, je vais vous présenter ce qu'est un document
# computationnel ainsi que les principes généraux que nous retrouverons
# dans chacun des trois environnements dont je vous ai précédemment
# parlé. L'intérêt de ce type de document est de permettre une
# transparence la plus complète possible.
** Modern Science
#+LaTeX: \includegraphics<1>[width=\linewidth]{img/iceberg_publication-1.png}%
#+LaTeX: \includegraphics<2>[width=\linewidth]{img/iceberg_publication-2.png}%
#+LaTeX: \includegraphics<3>[width=\linewidth]{img/iceberg_publication-3.png}%
#+LaTeX: \includegraphics<4>[width=\linewidth]{img/iceberg_publication-4.png}%
#+LaTeX: \includegraphics<5>[width=\linewidth]{img/iceberg_publication-5.png}%
# Note:
# # Data \to visualization/analysis \to article
# Si une partie de l'activité scientifique nécessite des mesures sur le
# terrain ou derrière une paillasse, la majeure partie se passe
# maintenant derrière un ordinateur, les données provenant de machines
# spécifiques: je pense par exemple à un accélérateur de particules, des
# séquenceurs d'ADN, un téléscope, un réseau de capteur ou bien sûr des
# simulations numériques s'exécutant sur des supercalculateurs.
# Une fois ces données obtenues, elles sont transformées pour être
# analysées, visualisées afin de mieux en comprendre la structure. Il
# est courant de partager ces visualisations avec des collègues,
# d'avoir un certain nombre d'itérations, de passer d'une vue à une
# autre jusqu'à trouver celle qui explique le mieux les choses. On
# utilise d'ailleurs souvent une multitude de logiciels spécifiques pour
# obtenir ces visualisations.
# Il arrive souvent qu'on soit déçu par les résultats, qu'on n'y
# comprenne rien ou qu'on se rende compte que les données ne sont pas
# intéressantes et qu'il faut se poser la poser la question sous un
# angle différent.
# Dans ce cas, retour à la case départ: acquisition de
# données, visualisations, statistiques, nombreux échanges avec les
# collègues...
# Puis ça y est, on trouve enfin quelque chose d'intéressant. On prend
# alors nos plus belles figures, on y ajoute les explications qui sont
# finalement les bonnes, on tente de rendre tout cela intéressant et on
# envoie l'ensemble à une conférence ou un journal.
# Hélas, dans un pdf de 8 pages, le lecteur trouvera une jolie histoire,
# des figures convaincantes mais n'aura aucune idée du réel travail
# effectué. L'article, c'est la partie émergée de l'iceberg et il n'y a
# alors plus aucun moyen de revenir sur les nombreuses tentatives et
# échecs, ni sur les calculs et les données derrière chacune de ces
# figures.
# La recherche reproductible, c'est permettre de pouvoir naviguer dans
# les deux sens et de combler le fossé séparant l'auteur du lecteur.
** Methodological Goals
Keep track to allow:
- *Inspection*: justify/understand
- *Re-execution*: check/fix/improve/reuse
# Note:
# Notre objectif est donc d'avoir un outil nous permettant:
# - d'une part d'inspecter toute cette démarche, afin que l'auteur
# puisse justifier pourquoi tel ou tel code est utilisé et que le
# lecteur puisse comprendre ce qui a été fait;
# - et d'autre part de refaire le calcul et l'analyse le plus
# simplement possible, ce qui est essentiel
# 1. pour permettre aux lecteurs de vérifier que ces calculs sont
# corrects,
# 2. pour permettre éventuellement de corriger des erreurs s'il y en a
# 3. et enfin pour permettre à d'autres de réutiliser ces travaux, soit
# sur un jeu de données différent, soit en réutilisant une partie de
# la procédure d'analyse dans un autre contexte.
** Behind the Scenes
\scriptsize
#+LaTeX: \only<1>{\hfill\includesvg[width=.5\linewidth]{img/example_pi_full-1}}%
#+LaTeX: \only<2>{\includesvg[width=\linewidth]{img/example_pi_full-2}}%
#+LaTeX: \only<3>{\includesvg[width=\linewidth]{img/example_pi_full-3}}%
#+LaTeX: \only<4>{\includesvg[width=\linewidth]{img/example_pi_full-4}}%
#+LaTeX: \only<5>{\includesvg[width=\linewidth]{img/example_pi_full-5}}%
#+LaTeX: \only<6>{\includesvg[width=\linewidth]{img/example_pi_full-6}}%
# #+LaTeX: \includesvg<1>[width=\linewidth]{img/example_pi_full-2.svg}%
# #+LaTeX: \includesvg<1>[width=\linewidth]{img/example_pi_full-3.svg}%
# #+LaTeX: \includesvg<1>[width=\linewidth]{img/example_pi_full-4.svg}%
# #+LaTeX: \includesvg<1>[width=\linewidth]{img/example_pi_full-5.svg}%
# #+LaTeX: \includesvg<1>[width=\linewidth]{img/example_pi_full-6.svg}%
# Note:
# Voici la partie émergée du document computationnel. Au premier abord,
# il s'agit d'un document tout à fait banal avec un titre, du texte,
# éventuellement un petit morceau de code illustrant une procédure de
# calcul, des résultats numériques, des formules de maths, des figures,
# etc. Bref, un article classique au format pdf ou html.
# Voici maintenant ce qui se cache derrière ce document: ici, un
# notebook Jupyter tel que nous pouvons le voir dans un navigateur
# web. C'est un document dynamique constitué de différentes parties sur
# lesquelles on peut interagir.
# Tout d'abord du texte au format markdown: ce sont les zones de texte
# que j'ai surlignées en orange. Le formattage est assez simple, on peut
# assez facilement y inclure des liens hypertextes ou des formules
# mathématiques.
# Entre ces zones de texte, on trouve des zones de code, que j'ai
# surlignées en bleu. Ici il s'agit de fragments de code python
# relativement simples. Dans cet environnement, il est possible d'éditer
# directement ces fragments de code et les exécuter. En fait, un
# notebook a en interne une console python ouverte et lorsque l'on
# demande l'exécution d'un fragment de code, le code est directement
# envoyé dans la console et le résultat est automatiquement récupéré.
# Le résultat de chacun de ces différents codes est stocké juste en
# dessous dans les zones que j'ai surlignées en jaune. Puisque cette
# console reste "vivante" tout au long du document, les résultats
# calculés dans un bloc sont visibles dans le bloc suivant, ce qui
# encourage à ne pas écrire de longs blocs de code infâmes, mais au
# contraire à écrire de petits fragments, à calculer les choses petit à
# petit, tout en expliquant dans les zones de texte (en orange) comment
# les différents fragments de code (en bleu) s'enchaînent et éventuellement
# pourquoi, en fonction de ce que l'on vient de calculer (en jaune), on
# décide d'appliquer tel nouveau fragment.
# Une fois satisfait avec les calculs, on aime en général bien créer un
# document classique en exportant vers du pdf ou du html. Chaque zone
# (texte, code, résultat) est convertie et assemblée en un seul document
# markdown qui est à son tour transformé vers le format désiré avec un
# outil comme pandoc.
# Bien sûr, dans le document final, on ne souhaite pas forcément rendre
# tous les fragments de codes et tous les résultats visibles. C'est la
# raison pour laquelle pour chacune de ces zones, il est possible de
# spécifier si l'on souhaite la cacher ou pas.
# Enfin, si les résultats intermédiaires sont stockés automatiquement
# dans le notebook, l'environnement permet de ré-exécuter très
# simplement l'ensemble du code du notebook et de mettre à jour les
# résultats.
# C'est donc à vous de décider, selon le contexte, si vous souhaitez
# partager le document final, qui est souvent plus compact, ou le document
# computationnel qui va permettre une inspection complète et une
# réutilisation.
** Existing Tools
1. Jupyter
2. Rstudio/knitR
3. Org mode
| *Same Principles* | *Differences* |
|--------------------------------------+---------------------|
| • *A single document* | • Syntax |
| \qquad (explanations, code, results) | |
| • Session | • Interoperability |
| • Export | • Controling export |
# Note:
# Les trois environnements les plus matures permettant de créer de tels
# documents sont Jupyter, que vous venez de voir, Rstudio/knitr, et
# Org-mode. Ces trois environnements se distinguent par le niveau de
# technicité nécessaire à leur mise en oeuvre. Je ferai une petite démo
# de chacun de ces trois environnements dans les séquences suivantes. À
# l'issue de ces démonstrations, vous pourrez choisir lequel vous
# convient le mieux.
# Vous verrez que le principe reste le même dans les trois environnements:
# - Tout d'abord, avoir un seul document comprenant un entrelacs
# d'explications au format markdown, de code exécutable simplement, et
# les résultats de ces exécutions.
# Cette organisation permet l'inspection et la réexécution que nous
# nous étions fixés comme objectifs.
# - En interne, une console python ou R est active et assure une
# persistance des variables d'un fragment de code à l'autre. C'est la
# notion de session sur laquelle nous reviendrons pendant les
# démonstrations.
# - Enfin, il est possible d'exporter le document computationnel vers un
# format plus traditionnel éventuellement en masquant certaines
# parties.
# Les différences entre ces différents environnements sont relativement
# mineures:
# - Il y a quelques différences de syntaxe. Jupyter et Rstudio utilisent
# du markdown alors que Org mode utilise le format org qui est
# légèrement différent mais tout aussi lisible. La
# façon d'indiquer les zones de code et les résultats est également un
# peu différente mais c'est sans grande importance une fois dans
# l'environnement correspondant.
# - Plus important, peut-être l'interopérabilité entre différents
# langages. Jupyter vous permet de faire du python, du R, du ruby ou
# bien du julia mais pas vraiment d'utiliser plusieurs langages dans
# un même notebook. /Enfin/, c'est possible mais ça demande un peu de
# travail.
# Rstudio est conçu spécifiquement autour du langage R. Même s'il est
# possible d'utiliser du code python, vous verrez que ça n'est pas
# aussi convivial que pour R.
# Enfin, Org-mode permet une interaction entre les différents langages
# relativement naturelle mais comme je le disais, la courbe
# d'apprentissage est un peu plus raide.
# - Enfin, ces outils diffèrent par le contrôle offert en terme de mise
# en page lors de l'export. Jupyter et Rstudio se reposent sur
# markdown et donc sur pandoc. Le style par défaut est très bien,
# surtout si on souhaite produire du HTML. Mais si on doit produire un
# document PDF respectant un style particulier, ça peut être peu
# compliqué de demander à pandoc d'appliquer ce style.
# Org-mode ne fait à peu près rien pour vous de ce point de vue là. Il
# vous faudra donc de toutes façons configurer le style de votre
# export. Ceci dit, un des points que j'apprécie particulièrement
# lorsque je prépare un article en latex avec org-mode, c'est la
# capacité à écrire directement du LaTeX qui sera passé tel quel lors
# de l'export, ce qui me permet de faire exactement ce que je
# souhaite.
# Bien. Vous savez tout. Alors maintenant, Démo !
* M2-S4A: Hands On (Jupyter)
** Entering Behind the Scenes: Computational Documents
1. A few Recent Controversial Studies
2. Why is This so Difficult?
3. Computational Document: Principles
4. Hands on.
- *Jupyter*
- Rstudio
- Org-Mode
5. Collaborating
6. Comparative study
** Hands On: Jupyter
#+ATTR_LATEX: :height 2cm :center nil
file:img/jupyter-logo.png
** Startup
- Opening a document
- Quick Tour
- Saving
- Getting help
** Running Cells
- Running and getting results
- Adding a cell
- Beware of the order
- Session notion
- Possible inconsistencies
- Restart and run from the beginning
** Keyboard Shortcuts, Completion, and Ipython Magic
- Keyboard shortcuts =<h>=
- Python completion (numpy example)
- =%matplotlib=, =%lsmagic=
# =%run=, =%load=, =%load_ext=
** Using Other Languages
- Example for R:
- =%load_ext rpy2.ipython=
- =%%R %%sh %%perl=
- Interactions between =R= and =Python= are possible
** Producing and Sharing the Document
- Results are stored in the document
- $\to$ pretty-printed in gitlab
- =git pull/push=
- Export to HTML/PDF
** Preparing an Article
# Contrôler la visibilité du code et des résultats
- Hide-code plugin
- =%%latex= and =%%html=
- [[http://nbconvert.readthedocs.io/en/latest/external_exporters.html][Customize /exporters/:]]
\small\href{-1cm}
~jupyter nbconvert --to mypackage.MyExporter notebook.ipynb~
** Recap
- A lot of information in short time period
- Now it's your turn!
* M2-S4B: Hands On (Rstudio)
** Entering Behind the Scenes: Computational Documents
1. A few Recent Controversial Studies
2. Why is This so Difficult?
3. Computational Document: Principles
4. Hands on.
- Jupyter
- *Rstudio*
- Org-Mode
5. Collaborating
6. Comparative study
** Hands On: Rstudio
#+ATTR_LATEX: :height 2cm :center nil
file:img/RStudio-Logo-Blue-Gradient.png
#+ATTR_LATEX: :height 2cm :center nil
file:img//knitr.png
** Startup
- Opening a document
- Quick Tour
- Saving
- Getting help
** Running Chunks
- Running and getting results
- Adding a chunk
- Beware of the order
- Session notion
- Possible inconsistencies
- Restart and run from the beginning
** Keyboard Shortcuts, Completion
- Keyboard shortcuts
- R completion
- Folding
** Producing and Sharing the Document
- Knit
- Easy sharing via rpubs
** Controlling Code and Results Visibility
- Completion (chunk parameters)
** Using a Specific Style
- pdf, LaTeX
- html
- word/office
Writing raw LaTeX (R Sweave: =Rnw=) or HTML (R HTML:
=Rhtml=) to have full control is possible.
** Using Other Langages
- Inserting and running a Python chunk
- Warning: no session !
- Interaction between R and Python is done solely through files,
which encourages to write long chunks $\frowny$
** Recap
- A lot of information in short time period
- Now it's your turn!
* M2-S4C: Hands on (Org-Mode)
** Entering Behind the Scenes: Computational Documents
1. A few Recent Controversial Studies
2. Why is This so Difficult?
3. Computational Document: Principles
4. Hands on.
- Jupyter
- Rstudio
- *Org-Mode*
5. Collaborating
6. Comparative study
** Hands On: Org Mode
#+ATTR_LATEX: :height 2cm :center nil
file:img/600px-EmacsIcon.svg.png
#+ATTR_LATEX: :height 2cm :center nil
file:img/442px-Org-mode-unicorn.svg.png
# Note:
# Même plan que précédemment
** Startup
- Opening a document
- Quick Tour
- Folding / Browsing
- Restructuring
- Saving
- Getting help
** Running Code Blocks
- Inserting an R block
- Running and getting résultats
- Beware of the order
- Session notion
- Possible inconsistencies
- Restart and run from the beginning
** Keyboard Shortcuts, Completion
- Block expansion
- R graphics
- Python, Perl, ...
- Shell session
- Several sessions, several languages !
- Language interactions
** Browsing
- Folding
- Restructuration
# - Annotation (tags) ???
# - Sparse Tree ???
** Producing and Sharing the Document
- Git Commit
- Beware of produced files
- Export
- Controling visibility of code and results
- Hidden sections
** Using a Specific Style
- pdf, LaTeX
- HTML
- Writing raw LaTeX or raw HTML in the middle of the org document is easy
** Recap
- A lot of information in short time period
- Learn the shortcuts one after the other. The main ones are in the
first entry of the journal
- Now it's your turn!
* M2-S5: Collaborating
** Entering Behind the Scenes: Computational Documents
1. A few Recent Controversial Studies
2. Why is This so Difficult?
3. Computational Document: Principles
4. Hands on.
- Jupyter
- Rstudio
- Org-Mode
5. *Collaborating*
6. Comparative study
** Collaborating
file:img/jumping_penguin.png
** Preparing a Document for a Journal or a Conference
Requirements for producing a *pdf*:
- Internally, /pandoc/, /knitr/ or /emacs/org-mode/
- /LaTeX/ should be installed
Exporting as *office/word* documents is possible (requires a specific
configuration in Jupyter). Otherwise export *html*...
*** In any case:
- Need to hide some cells
- Use the right style
# Soyons honnêtes
*** Producing such kind of documents requires a perfectly configured environment
# Note:
# Tout ces détails auront été expliqués avant pour chaque environnement.
# - http://blog.juliusschulz.de/blog/ultimate-ipython-notebook
# - https://github.com/kirbs-/hide_code is a must-have
# - http://svmiller.com/blog/2016/02/svm-r-markdown-manuscript/
# - https://github.com/balouf/Kleinberg/blob/master/KleinbergsGridSimulator.ipynb
# - Il y doit y avoir des choses équivalentes, mais plus simples pour
# Rmd
# - Et pour emacs, c'est d'une certaine façon plus simple car on est
# habitué à bidouiller.
** Convincing Your Co-authors
When confronted to this complexity, there are several possible
attitudes:
1. Nevermind, it's awesome! Let's do this!
2. Err... it looks cool but I really don't have the time to learn this
now...
3. Yet another new tool? Forget it!
$\leadsto$ several possible collaboration modes
** Option 1: Enthusiastic Co-authors
You'll have to *provide technical support*:
- Compatibility issues between the different environments
- Manage this complexity (Jupyter/Rstudio/Emacs, Git, ...)
It is the best way to *ensure everything is reproducible* (not only on
*your* machine\dots) and inspectable
** Option 2: A Minima Investment
Your co-authors let you manage the code and the results all by
yourself but are ready to make efforts to edit your document.
*They can:*
- Edit the content of the article (Markdown or Org-Mode)
*They can't:*
- Re-execute the code
- Export and generate the final document
** Option 3: "Defiant" Co-auteurs
*Co-auteurs do not change their habits*
- A separated /computational document/ allows to produce all results and
figures
- An other (/standard/) document includes generated figures
Everything is *stored*, *documented* and can be *re-computed* in your
computational document!
** Publishing / Sharing Your Document
*Rpubs*
- Great for a quick sharing but no durability
*Dropbox and alike*
- +Durability+, access ??, ...
*Gitlab/Github/...*
1. Go public (along with the history!)
2. Clean up the repository and archive the current state in a
companion website
*Companion websites*
- Runmycode, Editors, ...
- Article: *HAL* ; code and data: *Figshare / Zenodo*
** Conclusion
Several options depending on:
- your co-authors
- technical constraints
- confidentiality/copyright constraints
* M2-S6: Comparative Study
** Entering Behind the Scenes: Computational Documents
1. A few Recent Controversial Studies
2. Why is This so Difficult?
3. Computational Document: Principles
4. Hands on.
- Jupyter
- Rstudio
- Org-Mode
5. Collaborating
6. *Comparative study*
** Comparative Study
#+ATTR_LATEX: :height 2cm :center nil
file:img/jupyter-logo.png
#+ATTR_LATEX: :height 2cm :center nil
file:img/RStudio-Logo-Blue-Gradient.png
#+ATTR_LATEX: :height 2cm :center nil
file:img/442px-Org-mode-unicorn.svg.png
#+ATTR_LATEX: :height 2cm :center nil
file:img/question_mark.png
\bigskip
A computational document. What for ?
# Note:
# - Pour comparer ces différents outils, il est important de bien
# identifier l'usage que l'on souhaite en faire.
# - Nous allons regarder ensemble quelques cas d'usages
** A Lecture or a Tutorial
A Jupyter notebook
- Easy to use for students
- Dynamic document
# Note:
# - Super pratique.
# - Téléchargement, exécution dynamique, résultats interactifs,
# variations faciles, etc.
# - C'est idéal pour un document à destination d'auto-formation.
** A Journal
[[file:~/org/journal.org][My journal with org-mode]]
- A single author
- Chronological organization
- Labels
- Notes, links, code
# Note:
# - Structuration type: par date
# - Mots-clés
# - Navigation aisée
# - Réexécution de code comme d'habitude
** A Laboratory Notebook
[[file:~/Work/Documents/Articles/2018/Alya-Perf/LabBook.org][A laboratory notebook with org-mode]]
- Semantic organization
- Conventions
- Several authors
- Labels per author, experiment, etc.
# Note:
# - Assez proche d'un journal mais avec un contenu bien plus technique
# et fait pour être exploitable par des collègues.
# - Exemple de structuration.
** A Reproducible Article
[[file:~/Work/Documents/Articles/2017/paper-hpl-at-scale/paper.org][An ongoing article]]
- Several authors
- Regenerate figures
- Track back the sources
# Note:
# - On voit la structure de l'article.
# - Certaines sections sont cachées
# - Elles pointent vers le cahier de laboratoire traçant les données
# que je vais exploiter.
# - Ici, je suis reparti de figure que Tom avait faites et je les ai
# retravaillées et adaptées à ce dont j'avais besoin pour mon
# article.
# - Ici, c'est un peu "sale", il y a des liens vers des fichiers qui
# sont sur mon disque dur mais c'est un article en cours de
# préparation et vous voyez que j'ai bien accès à l'ensemble des
# informations dont j'ai besoin.
# - Plusieurs structurations sont possibles. En général, j'ai une
# grosse section cachée au début de l'article où j'indique comment
# récupérer l'ensemble des données (avec les commandes git ou les
# URLs). Le reste du code d'analyse contenu dans l'article peut alors
# être exécuté.
# - Ici, comme on prépare un article, il est essentiel de pouvoir cacher
# certaines sections et d'avoir un contrôle complet sur la typographie
# car on n'a jamais assez de place.
# - Dans tous les cas, tout ceci n'est possible que si on a suffisemment
# de matière, c'est-à-dire que si on a pris régulièrement des notes
# sur comment on a obtenu les données et sur comment on les a
# analysées. C'est ce que vous mettrez en pratique dans le module 3
# avec l'outil de votre choix.
** Technical Differences
#+LaTeX: \null\hspace{-1cm}\begin{overlayarea}{\linewidth}{2.4cm}\scalebox{.73}{
#+ATTR_LATEX: :center nil
| | Origin | Technology | Usage | Browsing | Format | Article? |
|---------------+-----------+--------------------+--------------+-----------+--------+-----------|
| Jupyter | 2001 | Web App., Python | Easy | Limited | JSON | Difficult |
| Rstudio/knitr | 2011/2014 | IDE, Java/R | Easy | Limited | Rmd | Yes |
| Org-Mode | 1976/2008 | Editeur, EmacsLisp | More complex | Powerful | Org | Yes |
#+LaTeX: }\end{overlayarea}
Technology does not really matter. You need to:
- collect information
- organize it and prepare for exploitation
- make it available
# Note:
# - L'écosystème évolue mais vous pouvez déjà vous en saisir.
** Bonus: expériences vécues :noexport:
- Complétion, introspection donc développement/composition pas si
désagréable comparé à un IDE avancé.
- Objectif atteint. Mois par mois: permet aux collègues d'aider,
d'avancer ensemble, etc. Communication de "problèmes" (données
manquantes par exemple) bien plus simple.
- Un document dynamique et traçable, réexecutable, modifiable,
réutilisable, ... Quand le reviewer 3 demande de refaire la figure 5
en noir et blanc et de changer les légendes. Ou bien de rajouter de
la compléter.
- Au jour le jour: meilleur réutilisation (par exemple entre l'article
et le slide)
Éléments clés lors du choix:
- Simplicité de prise en main vs. vrai éditeur
- Où sont fait les calculs
- Multi-langage
- http://carreau.github.io/posts/23-Cross-Language-Integration.html
- Gestion des langages compilés
- Notions de caches et d'état
Les principaux outils actuels:
- jupyter
- rstudio
- org-mode
Limitations:
- Longs calculs
- Grands documents
- Solutions wysiwyg pour jupyter
Historique/diff un peu compliqué pour jupyter
C028AL_slides_module3-fr.pdf: diapos-module3.pdf
mv $< $@
C028AL_slides_module3-en.pdf: slides-module3.pdf
mv $< $@
%.pdf: %.tex
pdflatex --shell-escape $^
pdflatex --shell-escape $^
%.tex: %.org
emacs -batch $^ --funcall org-beamer-export-to-latex
images: img/analyse-traditionnelle-3-svg.pdf img/traditional-analysis-3-svg.pdf img/analyse-replicable-3-svg.pdf img/replicable-analysis-3-svg.pdf
img/%-svg.pdf: img/%.svg
# /Applications/Inkscape.app/Contents/Resources/bin/ # for MacOSX
inkscape -D -z --file=$(abspath $<) --export-pdf=$(abspath $@)
#+TITLE: La main à la pâte : une analyse réplicable
#+AUTHOR: @@latex:{\large Konrad Hinsen} \\ \vspace{0.2cm}CBM, CNRS Orléans et Synchrotron SOLEIL\\ \vspace{0.2cm} \texttt{konrad.hinsen@cnrs.fr}@@
#+OPTIONS: H:2 tags:nil
#+EXCLUDE_TAGS: noexport
#+LANGUAGE: fr
#+SELECT_TAGS: export
#+LATEX_CLASS: beamer
#+LATEX_CLASS_OPTIONS: [presentation,bigger]
#+LATEX_HEADER: \usepackage[french]{babel}
#+LATEX_HEADER: \usepackage[normalem]{ulem}
#+BEAMER_HEADER: \setbeamercovered{invisible}
#+BEAMER_HEADER: \beamertemplatenavigationsymbolsempty
#+STARTUP: beamer
#+COLUMNS: %45ITEM %10BEAMER_ENV(Env) %10BEAMER_ACT(Act) %4BEAMER_COL(Col) %8BEAMER_OPT(Opt)
#+STARTUP: indent
#+PROPERTY: header-args :eval no-export
* M3-S1: Une analyse réplicable, c'est quoi?
** 3. La main à la pâte: une analyse réplicable
1. *Une analyse réplicable, c'est quoi?*
2. Étude de cas: l'incidence de syndromes grippaux
3. Importer les données. Au choix:
- Jupyter
- RStudio
- OrgMode
4. Vérification et inspection. Au choix:
- Jupyter
- RStudio
- OrgMode
5. Questions et réponses. Au choix:
- Jupyter
- RStudio
- OrgMode
** L'analyse de données traditionnelle
[[file:img/analyse-traditionnelle-3-svg.pdf]]
** L'analyse de données réplicable
[[file:img/analyse-replicable-3-svg.pdf]]
** Pourquoi faire réplicable?
- Facile à refaire si les données changent
- Facile à modifier
- Facile à inspecter et vérifier
* M3-S2: Étude de cas: l'incidence de syndromes grippaux
** 3. La main à la pâte: une analyse réplicable
1. Une analyse réplicable, c'est quoi?
2. *Étude de cas: l'incidence de syndromes grippaux*
3. Importer les données. Au choix:
- Jupyter
- RStudio
- OrgMode
4. Vérification et inspection. Au choix:
- Jupyter
- RStudio
- OrgMode
5. Questions et réponses. Au choix:
- Jupyter
- RStudio
- OrgMode
** Les points clés à retenir
- Aucune modification des données "à la main".
- Du code pour tout!
* M3-S3A: Importer les données (Jupyter)
** 3. La main à la pâte: une analyse réplicable
1. Une analyse réplicable, c'est quoi?
2. Étude de cas: l'incidence de syndromes grippaux
3. *Importer les données*. Au choix:
- *Jupyter*
- RStudio
- OrgMode
4. Vérification et inspection. Au choix:
- Jupyter
- RStudio
- OrgMode
5. Questions et réponses. Au choix:
- Jupyter
- RStudio
- OrgMode
** Choix techniques
- Notebook Jupyter
- Langage Python 3
- Bibliothèques:
- pandas
- matplotlib
- isoweek
** Les points clés à retenir
- Lecture des données directement de la source
- Gestion des données manquantes
* M3-S3B: Importer les données (RStudio)
** 3. La main à la pâte: une analyse réplicable
1. Une analyse réplicable, c'est quoi?
2. Étude de cas: l'incidence de syndromes grippaux
3. *Importer les données*. Au choix:
- Jupyter
- *RStudio*
- OrgMode
4. Vérification et inspection. Au choix:
- Jupyter
- RStudio
- OrgMode
5. Questions et réponses. Au choix:
- Jupyter
- RStudio
- OrgMode
** Choix techniques
- Environnement RStudio
- Langage R
- Bibliothèque: parsedate
** Les points clés à retenir
- Lecture des données directement de la source
- Attention aux données manquantes
* M3-S3C: Importer les données (OrgMode)
** 3. La main à la pâte: une analyse réplicable
1. Une analyse réplicable, c'est quoi?
2. Étude de cas: l'incidence de syndromes grippaux
3. *Importer les données*. Au choix:
- Jupyter
- RStudio
- *OrgMode*
4. Vérification et inspection. Au choix:
- Jupyter
- RStudio
- OrgMode
5. Questions et réponses. Au choix:
- Jupyter
- RStudio
- OrgMode
** Choix techniques
- Environnement Environnement Emacs + Org mode
- Langages:
- Python 3 pour préparer les données
- R pour l'analyse
** Les points clés à retenir
- Lecture des données directement de la source
- Gestion des données manquantes
* M3-S4A/B/C: Vérification et inspection
** 3. La main à la pâte: une analyse réplicable
1. Une analyse réplicable, c'est quoi?
2. Étude de cas: l'incidence de syndromes grippaux
3. Importer les données. Au choix:
- Jupyter
- RStudio
- OrgMode
4. *Vérification et inspection*. Au choix:
- *Jupyter*
- *RStudio*
- *OrgMode*
5. Questions et réponses. Au choix:
- Jupyter
- RStudio
- OrgMode
** Les points clés à retenir
- Pré-traitement des données
- Adapter aux conventions des logiciels
- Faciliter l'analyse
- Vérifier autant que possible
- Inspection visuelle
- Code de validation
* M3-S5A/B/C: Questions et réponses
** 3. La main à la pâte: une analyse réplicable
1. Une analyse réplicable, c'est quoi?
2. Étude de cas: l'incidence de syndromes grippaux
3. Importer les données. Au choix:
- Jupyter
- RStudio
- OrgMode
4. Vérification et inspection. Au choix:
- Jupyter
- RStudio
- OrgMode
5. *Questions et réponses*. Au choix:
- *Jupyter*
- *RStudio*
- *OrgMode*
** Questions
1. Quelles années ont connu les épidémies les plus fortes?
2. Quelle est la fréquence d'épidémies faibles, moyennes, et fortes?
** Les points clés à retenir
- Une analyse réplicable doit contenir *toutes les étapes* de traitement des données sous une forme *exécutable*.
- Il est important d'*expliquer* tous les choix qui peuvent influencer les résultats.
- Ceci nécessite d'exposer beaucoup de *détails techniques*, parce que c'est à ce niveau qu'on fait *le plus d'erreurs*!
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="123.49674mm"
height="55.556908mm"
viewBox="0 0 437.58688 196.85518"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="analyse-replicable-1.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.01"
inkscape:cx="207.88971"
inkscape:cy="37.447866"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1641"
inkscape:window-height="1005"
inkscape:window-x="39"
inkscape:window-y="1"
inkscape:window-maximized="1"
fit-margin-top="5"
fit-margin-left="5"
fit-margin-right="5"
fit-margin-bottom="5" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-46.816317,-70.398035)">
<g
id="g4184">
<rect
y="188.54773"
x="64.966003"
height="60.555801"
width="181.28751"
id="rect4156"
style="opacity:1;fill:#edb2b2;fill-opacity:1;stroke:#000000;stroke-width:0.86630201;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="98.34169"
y="229.52631"
id="text4142"
sodipodi:linespacing="100%"><tspan
sodipodi:role="line"
id="tspan4144"
x="98.34169"
y="229.52631">résultats</tspan></text>
</g>
<g
id="g4194">
<rect
style="opacity:1;fill:#bcf7bc;fill-opacity:1;stroke:#000000;stroke-width:0.86630201;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4158"
width="181.28751"
height="60.555801"
x="284.966"
y="188.54773" />
<text
sodipodi:linespacing="100%"
id="text4150"
y="229.32123"
x="306.02234"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
y="229.32123"
x="306.02234"
id="tspan4152"
sodipodi:role="line">discussion</tspan></text>
</g>
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="123.49674mm"
height="55.556908mm"
viewBox="0 0 437.58688 196.85518"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="analyse-replicable-2.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.01"
inkscape:cx="207.88971"
inkscape:cy="-2.1560943"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1641"
inkscape:window-height="1005"
inkscape:window-x="39"
inkscape:window-y="1"
inkscape:window-maximized="1"
fit-margin-top="5"
fit-margin-left="5"
fit-margin-right="5"
fit-margin-bottom="5" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-46.816317,-70.398035)">
<g
id="g4223">
<rect
style="opacity:1;fill:#d2e8f2;fill-opacity:1;stroke:#000000;stroke-width:0.86630201;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4154"
width="181.28751"
height="60.555801"
x="64.966003"
y="88.547722" />
<text
sodipodi:linespacing="100%"
id="text4138"
y="128.5307"
x="123.28798"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
y="128.5307"
x="123.28798"
id="tspan4140"
sodipodi:role="line">code</tspan></text>
</g>
<g
id="g4184">
<rect
y="188.54773"
x="64.966003"
height="60.555801"
width="181.28751"
id="rect4156"
style="opacity:1;fill:#edb2b2;fill-opacity:1;stroke:#000000;stroke-width:0.86630201;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="98.34169"
y="229.52631"
id="text4142"
sodipodi:linespacing="100%"><tspan
sodipodi:role="line"
id="tspan4144"
x="98.34169"
y="229.52631">résultats</tspan></text>
</g>
<g
id="g4194">
<rect
style="opacity:1;fill:#bcf7bc;fill-opacity:1;stroke:#000000;stroke-width:0.86630201;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4158"
width="181.28751"
height="60.555801"
x="284.966"
y="188.54773" />
<text
sodipodi:linespacing="100%"
id="text4150"
y="229.32123"
x="306.02234"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
y="229.32123"
x="306.02234"
id="tspan4152"
sodipodi:role="line">discussion</tspan></text>
</g>
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="123.49674mm"
height="55.556908mm"
viewBox="0 0 437.58688 196.85518"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="analyse-replicable.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.82"
inkscape:cx="130.01295"
inkscape:cy="-2.1560943"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1241"
inkscape:window-height="755"
inkscape:window-x="39"
inkscape:window-y="1"
inkscape:window-maximized="1"
fit-margin-top="5"
fit-margin-left="5"
fit-margin-right="5"
fit-margin-bottom="5" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-46.816317,-70.398035)">
<g
id="g4223">
<rect
style="opacity:1;fill:#d2e8f2;fill-opacity:1;stroke:#000000;stroke-width:0.86630201;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4154"
width="181.28751"
height="60.555801"
x="64.966003"
y="88.547722" />
<text
sodipodi:linespacing="100%"
id="text4138"
y="128.5307"
x="123.28798"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
y="128.5307"
x="123.28798"
id="tspan4140"
sodipodi:role="line">code</tspan></text>
</g>
<g
id="g4184">
<rect
y="188.54773"
x="64.966003"
height="60.555801"
width="181.28751"
id="rect4156"
style="opacity:1;fill:#edb2b2;fill-opacity:1;stroke:#000000;stroke-width:0.86630201;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="98.34169"
y="229.52631"
id="text4142"
sodipodi:linespacing="100%"><tspan
sodipodi:role="line"
id="tspan4144"
x="98.34169"
y="229.52631">résultats</tspan></text>
</g>
<g
id="g4228">
<rect
y="88.547722"
x="284.966"
height="60.555801"
width="181.28751"
id="rect4136"
style="opacity:1;fill:#bcf7bc;fill-opacity:1;stroke:#000000;stroke-width:0.86630201;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="304.87805"
y="128.45746"
id="text4146"
sodipodi:linespacing="100%"><tspan
sodipodi:role="line"
id="tspan4148"
x="304.87805"
y="128.45746">explication</tspan></text>
</g>
<g
id="g4194">
<rect
style="opacity:1;fill:#bcf7bc;fill-opacity:1;stroke:#000000;stroke-width:0.86630201;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4158"
width="181.28751"
height="60.555801"
x="284.966"
y="188.54773" />
<text
sodipodi:linespacing="100%"
id="text4150"
y="229.32123"
x="306.02234"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
y="229.32123"
x="306.02234"
id="tspan4152"
sodipodi:role="line">discussion</tspan></text>
</g>
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="123.49674mm"
height="55.556908mm"
viewBox="0 0 437.58688 196.85518"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="analyse-traditionnelle-1.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.24"
inkscape:cx="198.58135"
inkscape:cy="-2.1560943"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1447"
inkscape:window-height="946"
inkscape:window-x="98"
inkscape:window-y="0"
inkscape:window-maximized="0"
fit-margin-top="5"
fit-margin-left="5"
fit-margin-right="5"
fit-margin-bottom="5" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-46.816317,-70.398035)">
<g
id="g4184">
<rect
y="188.54773"
x="64.966003"
height="60.555801"
width="181.28751"
id="rect4156"
style="opacity:1;fill:#edb2b2;fill-opacity:1;stroke:#000000;stroke-width:0.86630201;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="98.34169"
y="229.52631"
id="text4142"
sodipodi:linespacing="100%"><tspan
sodipodi:role="line"
id="tspan4144"
x="98.34169"
y="229.52631">résultats</tspan></text>
</g>
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="123.49674mm"
height="55.556908mm"
viewBox="0 0 437.58688 196.85518"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="analyse-traditionnelle-2.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.24"
inkscape:cx="198.58135"
inkscape:cy="-2.1560943"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1447"
inkscape:window-height="946"
inkscape:window-x="98"
inkscape:window-y="0"
inkscape:window-maximized="0"
fit-margin-top="5"
fit-margin-left="5"
fit-margin-right="5"
fit-margin-bottom="5" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-46.816317,-70.398035)">
<g
id="g4184">
<rect
y="188.54773"
x="64.966003"
height="60.555801"
width="181.28751"
id="rect4156"
style="opacity:1;fill:#edb2b2;fill-opacity:1;stroke:#000000;stroke-width:0.86630201;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="98.34169"
y="229.52631"
id="text4142"
sodipodi:linespacing="100%"><tspan
sodipodi:role="line"
id="tspan4144"
x="98.34169"
y="229.52631">résultats</tspan></text>
</g>
<g
id="g3380">
<rect
y="88.544823"
x="284.15286"
height="60.561592"
width="178.85429"
id="rect4136"
style="opacity:1;fill:#bcf7bc;fill-opacity:1;stroke:#000000;stroke-width:0.86050981;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="339.97162"
y="115.82331"
id="text4146"
sodipodi:linespacing="100%"><tspan
id="tspan3356"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
sodipodi:role="line"
x="339.97162"
y="115.82331">résumé</tspan></text>
<text
sodipodi:linespacing="100%"
id="text3358"
y="135.33551"
x="302.14447"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
y="135.33551"
x="302.14447"
sodipodi:role="line"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
id="tspan3362">méthodologique</tspan></text>
</g>
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="123.49674mm"
height="55.556908mm"
viewBox="0 0 437.58688 196.85518"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="analyse-traditionnelle.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.82"
inkscape:cx="198.58135"
inkscape:cy="-2.1560943"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1241"
inkscape:window-height="755"
inkscape:window-x="98"
inkscape:window-y="0"
inkscape:window-maximized="0"
fit-margin-top="5"
fit-margin-left="5"
fit-margin-right="5"
fit-margin-bottom="5" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-46.816317,-70.398035)">
<g
id="g4184">
<rect
y="188.54773"
x="64.966003"
height="60.555801"
width="181.28751"
id="rect4156"
style="opacity:1;fill:#edb2b2;fill-opacity:1;stroke:#000000;stroke-width:0.86630201;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="98.34169"
y="229.52631"
id="text4142"
sodipodi:linespacing="100%"><tspan
sodipodi:role="line"
id="tspan4144"
x="98.34169"
y="229.52631">résultats</tspan></text>
</g>
<g
id="g4194">
<rect
style="opacity:1;fill:#bcf7bc;fill-opacity:1;stroke:#000000;stroke-width:0.86630201;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4158"
width="181.28751"
height="60.555801"
x="284.966"
y="188.54773" />
<text
sodipodi:linespacing="100%"
id="text4150"
y="229.32123"
x="306.02234"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
y="229.32123"
x="306.02234"
id="tspan4152"
sodipodi:role="line">discussion</tspan></text>
</g>
<g
id="g3380">
<rect
y="88.544823"
x="284.15286"
height="60.561592"
width="178.85429"
id="rect4136"
style="opacity:1;fill:#bcf7bc;fill-opacity:1;stroke:#000000;stroke-width:0.86050981;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="339.97162"
y="115.82331"
id="text4146"
sodipodi:linespacing="100%"><tspan
id="tspan3356"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
sodipodi:role="line"
x="339.97162"
y="115.82331">résumé</tspan></text>
<text
sodipodi:linespacing="100%"
id="text3358"
y="135.33551"
x="302.14447"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
y="135.33551"
x="302.14447"
sodipodi:role="line"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
id="tspan3362">méthodologique</tspan></text>
</g>
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="123.49674mm"
height="55.556908mm"
viewBox="0 0 437.58688 196.85518"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="replicable-analysis-1.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.82"
inkscape:cx="-48.03583"
inkscape:cy="-2.1560943"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1641"
inkscape:window-height="1005"
inkscape:window-x="39"
inkscape:window-y="1"
inkscape:window-maximized="1"
fit-margin-top="5"
fit-margin-left="5"
fit-margin-right="5"
fit-margin-bottom="5" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-46.816317,-70.398035)">
<g
id="g4152">
<rect
y="188.54773"
x="64.966003"
height="60.555801"
width="181.28751"
id="rect4156"
style="opacity:1;fill:#edb2b2;fill-opacity:1;stroke:#000000;stroke-width:0.86630201;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="110.88075"
y="229.52631"
id="text4142"
sodipodi:linespacing="100%"><tspan
sodipodi:role="line"
id="tspan4144"
x="110.88075"
y="229.52631">results</tspan></text>
</g>
<g
id="g4194">
<rect
style="opacity:1;fill:#bcf7bc;fill-opacity:1;stroke:#000000;stroke-width:0.86630201;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4158"
width="181.28751"
height="60.555801"
x="284.966"
y="188.54773" />
<text
sodipodi:linespacing="100%"
id="text4150"
y="229.32123"
x="306.02234"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
y="229.32123"
x="306.02234"
id="tspan4152"
sodipodi:role="line">discussion</tspan></text>
</g>
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="123.49674mm"
height="55.556908mm"
viewBox="0 0 437.58688 196.85518"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="replicable-analysis-2.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.82"
inkscape:cx="-48.03583"
inkscape:cy="-2.1560943"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1641"
inkscape:window-height="1005"
inkscape:window-x="39"
inkscape:window-y="1"
inkscape:window-maximized="1"
fit-margin-top="5"
fit-margin-left="5"
fit-margin-right="5"
fit-margin-bottom="5" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-46.816317,-70.398035)">
<g
id="g4223">
<rect
style="opacity:1;fill:#d2e8f2;fill-opacity:1;stroke:#000000;stroke-width:0.86630201;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4154"
width="181.28751"
height="60.555801"
x="64.966003"
y="88.547722" />
<text
sodipodi:linespacing="100%"
id="text4138"
y="128.5307"
x="123.28798"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
y="128.5307"
x="123.28798"
id="tspan4140"
sodipodi:role="line">code</tspan></text>
</g>
<g
id="g4152">
<rect
y="188.54773"
x="64.966003"
height="60.555801"
width="181.28751"
id="rect4156"
style="opacity:1;fill:#edb2b2;fill-opacity:1;stroke:#000000;stroke-width:0.86630201;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="110.88075"
y="229.52631"
id="text4142"
sodipodi:linespacing="100%"><tspan
sodipodi:role="line"
id="tspan4144"
x="110.88075"
y="229.52631">results</tspan></text>
</g>
<g
id="g4194">
<rect
style="opacity:1;fill:#bcf7bc;fill-opacity:1;stroke:#000000;stroke-width:0.86630201;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4158"
width="181.28751"
height="60.555801"
x="284.966"
y="188.54773" />
<text
sodipodi:linespacing="100%"
id="text4150"
y="229.32123"
x="306.02234"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
y="229.32123"
x="306.02234"
id="tspan4152"
sodipodi:role="line">discussion</tspan></text>
</g>
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="123.49674mm"
height="55.556908mm"
viewBox="0 0 437.58688 196.85518"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="replicable-analysis-3.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.82"
inkscape:cx="-48.03583"
inkscape:cy="-2.1560943"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1641"
inkscape:window-height="1005"
inkscape:window-x="39"
inkscape:window-y="1"
inkscape:window-maximized="1"
fit-margin-top="5"
fit-margin-left="5"
fit-margin-right="5"
fit-margin-bottom="5" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-46.816317,-70.398035)">
<g
id="g4223">
<rect
style="opacity:1;fill:#d2e8f2;fill-opacity:1;stroke:#000000;stroke-width:0.86630201;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4154"
width="181.28751"
height="60.555801"
x="64.966003"
y="88.547722" />
<text
sodipodi:linespacing="100%"
id="text4138"
y="128.5307"
x="123.28798"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
y="128.5307"
x="123.28798"
id="tspan4140"
sodipodi:role="line">code</tspan></text>
</g>
<g
id="g4152">
<rect
y="188.54773"
x="64.966003"
height="60.555801"
width="181.28751"
id="rect4156"
style="opacity:1;fill:#edb2b2;fill-opacity:1;stroke:#000000;stroke-width:0.86630201;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="110.88075"
y="229.52631"
id="text4142"
sodipodi:linespacing="100%"><tspan
sodipodi:role="line"
id="tspan4144"
x="110.88075"
y="229.52631">results</tspan></text>
</g>
<g
id="g4160">
<rect
y="88.547722"
x="284.966"
height="60.555801"
width="181.28751"
id="rect4136"
style="opacity:1;fill:#bcf7bc;fill-opacity:1;stroke:#000000;stroke-width:0.86630201;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="299.25476"
y="128.45746"
id="text4146"
sodipodi:linespacing="100%"><tspan
sodipodi:role="line"
id="tspan4148"
x="299.25476"
y="128.45746">explanation</tspan></text>
</g>
<g
id="g4194">
<rect
style="opacity:1;fill:#bcf7bc;fill-opacity:1;stroke:#000000;stroke-width:0.86630201;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4158"
width="181.28751"
height="60.555801"
x="284.966"
y="188.54773" />
<text
sodipodi:linespacing="100%"
id="text4150"
y="229.32123"
x="306.02234"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
y="229.32123"
x="306.02234"
id="tspan4152"
sodipodi:role="line">discussion</tspan></text>
</g>
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="123.49674mm"
height="55.556908mm"
viewBox="0 0 437.58688 196.85518"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="traditional-analysis-1.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.82"
inkscape:cx="20.53257"
inkscape:cy="-2.1560943"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1241"
inkscape:window-height="755"
inkscape:window-x="98"
inkscape:window-y="0"
inkscape:window-maximized="0"
fit-margin-top="5"
fit-margin-left="5"
fit-margin-right="5"
fit-margin-bottom="5" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-46.816317,-70.398035)">
<rect
style="opacity:1;fill:#edb2b2;fill-opacity:1;stroke:#000000;stroke-width:0.86630201;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4156"
width="181.28751"
height="60.555801"
x="64.966003"
y="188.54773" />
<text
sodipodi:linespacing="100%"
id="text4142"
y="229.52631"
x="110.88075"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
y="229.52631"
x="110.88075"
id="tspan4144"
sodipodi:role="line">results</tspan></text>
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="123.49674mm"
height="55.556908mm"
viewBox="0 0 437.58688 196.85518"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="traditional-analysis-2.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.82"
inkscape:cx="20.53257"
inkscape:cy="-2.1560943"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1241"
inkscape:window-height="755"
inkscape:window-x="98"
inkscape:window-y="0"
inkscape:window-maximized="0"
fit-margin-top="5"
fit-margin-left="5"
fit-margin-right="5"
fit-margin-bottom="5" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-46.816317,-70.398035)">
<rect
style="opacity:1;fill:#edb2b2;fill-opacity:1;stroke:#000000;stroke-width:0.86630201;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4156"
width="181.28751"
height="60.555801"
x="64.966003"
y="188.54773" />
<text
sodipodi:linespacing="100%"
id="text4142"
y="229.52631"
x="110.88075"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
y="229.52631"
x="110.88075"
id="tspan4144"
sodipodi:role="line">results</tspan></text>
<rect
style="opacity:1;fill:#bcf7bc;fill-opacity:1;stroke:#000000;stroke-width:0.86050981;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4136"
width="178.85429"
height="60.561592"
x="284.15286"
y="88.544823" />
<text
sodipodi:linespacing="100%"
id="text4146"
y="115.82331"
x="340.21576"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
y="115.82331"
x="340.21576"
sodipodi:role="line"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
id="tspan3356">method</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="332.24213"
y="135.33551"
id="text3358"
sodipodi:linespacing="100%"><tspan
id="tspan3362"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
sodipodi:role="line"
x="332.24213"
y="135.33551">summary</tspan></text>
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="123.49674mm"
height="55.556908mm"
viewBox="0 0 437.58688 196.85518"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="traditional-analysis-3.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.82"
inkscape:cx="20.53257"
inkscape:cy="-2.1560943"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1241"
inkscape:window-height="755"
inkscape:window-x="98"
inkscape:window-y="0"
inkscape:window-maximized="0"
fit-margin-top="5"
fit-margin-left="5"
fit-margin-right="5"
fit-margin-bottom="5" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-46.816317,-70.398035)">
<rect
style="opacity:1;fill:#edb2b2;fill-opacity:1;stroke:#000000;stroke-width:0.86630201;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4156"
width="181.28751"
height="60.555801"
x="64.966003"
y="188.54773" />
<text
sodipodi:linespacing="100%"
id="text4142"
y="229.52631"
x="110.88075"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
y="229.52631"
x="110.88075"
id="tspan4144"
sodipodi:role="line">results</tspan></text>
<g
id="g4194">
<rect
style="opacity:1;fill:#bcf7bc;fill-opacity:1;stroke:#000000;stroke-width:0.86630201;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4158"
width="181.28751"
height="60.555801"
x="284.966"
y="188.54773" />
<text
sodipodi:linespacing="100%"
id="text4150"
y="229.32123"
x="306.02234"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
y="229.32123"
x="306.02234"
id="tspan4152"
sodipodi:role="line">discussion</tspan></text>
</g>
<rect
style="opacity:1;fill:#bcf7bc;fill-opacity:1;stroke:#000000;stroke-width:0.86050981;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4136"
width="178.85429"
height="60.561592"
x="284.15286"
y="88.544823" />
<text
sodipodi:linespacing="100%"
id="text4146"
y="115.82331"
x="340.21576"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
y="115.82331"
x="340.21576"
sodipodi:role="line"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
id="tspan3356">method</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="332.24213"
y="135.33551"
id="text3358"
sodipodi:linespacing="100%"><tspan
id="tspan3362"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
sodipodi:role="line"
x="332.24213"
y="135.33551">summary</tspan></text>
</g>
</svg>
#+TITLE: Diving in: a replicable analysis
#+AUTHOR: @@latex:{\large Konrad Hinsen} \\ \vspace{0.2cm}CBM, CNRS Orléans and Synchrotron SOLEIL\\ \vspace{0.2cm} \texttt{konrad.hinsen@cnrs.fr}@@
#+OPTIONS: H:2 tags:nil
#+EXCLUDE_TAGS: noexport
#+LANGUAGE: fr
#+SELECT_TAGS: export
#+LATEX_CLASS: beamer
#+LATEX_CLASS_OPTIONS: [presentation,bigger]
#+LATEX_HEADER: \usepackage[normalem]{ulem}
#+BEAMER_HEADER: \setbeamercovered{invisible}
#+BEAMER_HEADER: \beamertemplatenavigationsymbolsempty
#+STARTUP: beamer
#+COLUMNS: %45ITEM %10BEAMER_ENV(Env) %10BEAMER_ACT(Act) %4BEAMER_COL(Col) %8BEAMER_OPT(Opt)
#+STARTUP: indent
#+PROPERTY: header-args :eval no-export
* M3-S1: What is a replicable analysis?
** 3. Diving in: a replicable analysis
1. *What is a replicable analysis?*
2. Case study: incidence of influenza-like illness
3. Data import
- Jupyter
- RStudio
- OrgMode
4. Verification and inspection
- Jupyter
- RStudio
- OrgMode
5. Obtaining answers to a few questions
- Jupyter
- RStudio
- OrgMode
** Traditional data analysis
[[file:img/traditional-analysis-3-svg.pdf]]
** Replicable data analysis
[[file:img/replicable-analysis-3-svg.pdf]]
** Why do it replicably?
- Easy to re-do if the data change
- Easy to modify
- Easy to inspect and verify
* M3-S2: Case study: incidence of influenza-like illness
** 3. Diving in: a replicable analysis
1. What is a replicable analysis?
2. *Case study: incidence of influenza-like illness*
3. Data import
- Jupyter
- RStudio
- OrgMode
4. Verification and inspection
- Jupyter
- RStudio
- OrgMode
5. Obtaining answers to a few questions
- Jupyter
- RStudio
- OrgMode
** Take-home message
- No manual editing of data
- Everything is done in code!
* M3-S3A: Data import (Jupyter)
** 3. Diving in: a replicable analysis
1. What is a replicable analysis?
2. Case study: incidence of influenza-like illness
3. *Data import*
- *Jupyter*
- RStudio
- OrgMode
4. Verification and inspection
- Jupyter
- RStudio
- OrgMode
5. Obtaining answers to a few questions
- Jupyter
- RStudio
- OrgMode
** Technical choices
- Jupyter notebook
- Python 3 language
- Libraries:
- pandas
- matplotlib
- isoweek
** Take-home message
- The data are read directly from the source
- Missing data must be handled
* M3-S3B: Data import (RStudio)
** 3. Diving in: a replicable analysis
1. What is a replicable analysis?
2. Case study: incidence of influenza-like illness
3. *Data import*
- Jupyter
- *RStudio*
- OrgMode
4. Verification and inspection
- Jupyter
- RStudio
- OrgMode
5. Obtaining answers to a few questions
- Jupyter
- RStudio
- OrgMode
** Technical choices
- RStudio development environment
- R language
- Library: parsedate
** Take-home message
- The data are read directly from the source
- Missing data must be handled
* M3-S3C: Data import (OrgMode)
** 3. Diving in: a replicable analysis
1. What is a replicable analysis?
2. Case study: incidence of influenza-like illness
3. *Data import*
- Jupyter
- RStudio
- *OrgMode*
4. Verification and inspection
- Jupyter
- RStudio
- OrgMode
5. Obtaining answers to a few questions
- Jupyter
- RStudio
- OrgMode
** Technical choices
- Emacs editor + Org mode
- Languages:
- Python 3 for pre-processing
- R for analysis
** Take-home message
- The data are read directly from the source
- Missing data must be handled
* M3-S4A/B/C: Verification and inspection
** 3. Diving in: a replicable analysis
1. What is a replicable analysis?
2. Case study: incidence of influenza-like illness
3. Data import
- Jupyter
- RStudio
- OrgMode
4. *Verification and inspection*
- *Jupyter*
- *RStudio*
- *OrgMode*
5. Obtaining answers to a few questions
- Jupyter
- RStudio
- OrgMode
** Take-home message
- Preprocessing
- Adapt the data to the software's conventions
- Facilitates the analysis
- Verify as much as possible
- Visual inspection
- Validation code
* M3-S5A/B/C: Obtaining answers to a few questions
** 3. Diving in: a replicable analysis
1. What is a replicable analysis?
2. Case study: incidence of influenza-like illness
3. Data import
- Jupyter
- RStudio
- OrgMode
4. Verification and inspection
- Jupyter
- RStudio
- OrgMode
5. *Obtaining answers to a few questions*
- *Jupyter*
- *RStudio*
- *OrgMode*
** Questions
1. Which years have seen the strongest epidemics?
2. What is the frequency of weak, average, and strong epidemics?
** Take-home message
- A replicable analysis must contain *all* data processing steps in an *executable* form.
- It is important to *explain* all choices that have an impact on the results.
- This requires making many *technical details* explicit, because that is where most mistakes happen!
C028AL_slides_module4-en-gz.pdf: slides_module4.pdf
mv $< $@
C028AL_slides_module4-fr-gz.pdf: diapos_module4.pdf
mv $< $@
%-gz.pdf: %.pdf
gzprez $<
%.pdf: %.tex
pdflatex --shell-escape $^
pdflatex --shell-escape $^
%.tex: %.org
emacs -batch --eval "(setq enable-local-eval t)" --eval "(setq enable-local-variables t)" $^ --funcall org-beamer-export-to-latex
# sed -i -e 's|includegraphics\(.*\)../assets/img/|includegraphics\1../assets/img/thumbnail/|' -e 's/\.png}/.jpg}/i' $@
#+TITLE: Vers une étude reproductible :\newline la réalité du terrain
#+AUTHOR: @@latex:Christophe Pouzat, Arnaud Legrand, Konrad Hinsen@@
#+LATEX_CLASS: beamer
#+LATEX_CLASS_OPTIONS: [presentation,bigger,xcolor={usenames,dvipsnames,svgnames,table}]
#+STARTUP: beamer indent
#+LANGUAGE: fr
#+PROPERTY: header-args :eval no-export
#+OPTIONS: H:2 tags:nil
#+OPTIONS: num:t toc:nil \n:nil @:t ::t |:t ^:nil -:t f:t *:t <:t
#+OPTIONS: TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-toc
# #+OPTIONS: author:nil email:nil creator:nil timestamp:t
#+TAGS: noexport(n)
#+EXCLUDE_TAGS: noexport
#+LATEX_HEADER: % \usepackage{pgfpages}
#+LATEX_HEADER: % \setbeameroption{show notes on second screen=right}
#+LATEX_HEADER: \usepackage[francais]{babel}
#+LATEX_HEADER: \usepackage[normalem]{ulem}
#+LATEX_HEADER: \usepackage{svg}
#+LATEX_HEADER: \setbeamercovered{invisible}
#+LATEX_HEADER: \AtBeginSection[]{\begin{frame}<beamer>\frametitle{Où en sommes nous?}\tableofcontents[currentsection]\end{frame}}
#+LATEX_HEADER: \beamertemplatenavigationsymbolsempty
#+LATEX_HEADER: \usepackage{tikzsymbols}
#+LATEX_HEADER: \def\smiley{\Smiley[1][green!80!white]}
#+LATEX_HEADER: \def\frowny{\Sadey[1][red!80!white]}
#+LATEX_HEADER: \def\winkey{\Winkey[1][yellow]}
#+LATEX_HEADER: \usepackage{color,soul}
#+LATEX_HEADER: \definecolor{lightblue}{rgb}{1,.9,.7}
#+LATEX_HEADER: \sethlcolor{lightblue}
#+LATEX_HEADER: \newcommand{\muuline}[1]{\SoulColor\hl{#1}}
#+LATEX_HEADER: \makeatletter
#+LATEX_HEADER: \newcommand\SoulColor{%
#+LATEX_HEADER: \let\set@color\beamerorig@set@color
#+LATEX_HEADER: \let\reset@color\beamerorig@reset@color}
#+LATEX_HEADER: \makeatother
#+LATEX_HEADER: \let\hrefold=\href
#+LATEX_HEADER: \renewcommand{\href}[2]{\hrefold{#1}{\SoulColor\hl{#2}}}
#+LaTeX: \let\alert=\structure % to make sure the org * * works
#+LaTeX: \begin{frame}{Plan du cours}\tableofcontents\end{frame}
* Test et informations :noexport:
* Internal refs/notes :noexport:
** Images
- Notebook konrad:
- file:../slides-module2/jupyter-grippal-full.png
- file:../slides-module2/jupyter-grippal-top.png
- file:../slides-module2/jupyter-grippal-bottom.png
#+begin_src shell :results output :exports both
cd /home/alegrand/Work/Documents/Enseignements/RR_MOOC/slides-module2
file jupyter-grippal-full.png
rm /tmp/cropped_*
convert -crop 1345x3000 jupyter-grippal-full.png /tmp/cropped_%d.png
convert /tmp/cropped_*.png +append jupyter-grippal-paged.png
#+end_src
#+RESULTS:
: jupyter-grippal-full.png: PNG image data, 1345 x 8772, 8-bit/color RGBA, non-interlaced
#+begin_src shell :results output :exports both
cd /home/alegrand/Work/Documents/Enseignements/RR_MOOC/slides-module2
convert -scale x1507 jupyter-grippal-paged.png ../assets/img/nb3.png
#+end_src
#+RESULTS:
- Notebook Elisabeth: https://bitbucket.org/elizabethpwalton/smpe_project
#+begin_src shell :results output :exports both
cd /home/alegrand/Work/Documents/Enseignements/RR_MOOC/slides-module2
file elizabethpwalton_SMPE.png
rm /tmp/cropped_*
convert -crop 820x2650 elizabethpwalton_SMPE.png /tmp/cropped_%d.png
convert /tmp/cropped_*.png +append elizabethpwalton_SMPE-aged.png
#+end_src
#+RESULTS:
: elizabethpwalton_SMPE.png: PNG image data, 820 x 15217, 8-bit/color RGBA, non-interlaced
#+begin_src shell :results output :exports both
cd /home/alegrand/Work/Documents/Enseignements/RR_MOOC/slides-module2
convert -scale x1507 elizabethpwalton_SMPE-aged.png ../assets/img/nb4.png
#+end_src
#+RESULTS:
- Notebook Ismail:
#+begin_src shell :results output :exports both
cd /home/alegrand/Work/Documents/Enseignements/RR_MOOC/slides-module2
rm /tmp/cropped_*
convert -crop 590x1400 oscar.png /tmp/cropped_%d.png
for i in /tmp/cropped_[1-9].png ; do mv $i `echo $i | sed 's/cropped_/cropped_0/'` ; done
convert /tmp/cropped_*.png +append And_the_Oscar_goes_to-paged.png
#+end_src
#+RESULTS:
#+begin_src shell :results output :exports both
cd /home/alegrand/Work/Documents/Enseignements/RR_MOOC/slides-module2
convert -scale x1507 And_the_Oscar_goes_to-paged.png ../assets/img/nb5.png
#+end_src
#+RESULTS:
- Navette russe: https://io9.gizmodo.com/more-sad-remains-of-the-soviet-buran-space-shuttle-prog-1733190814
- Msieur il marche mon programme: https://www.luc-damas.fr/humeurs/images/il-marche-mon-programme.jpg
- PhD Comics:
- http://phdcomics.com/comics/archive.php?comicid=1947:
http://phdcomics.com/comics/archive/phd050817s.gif
- http://phdcomics.com/comics/archive.php?comicid=1948:
http://phdcomics.com/comics/archive/phd051017s.gif
** Graphe syndrome grippal:
#+begin_src shell :results output raw :exports both
debtree python3-matplotlib > img/python3-matplotlib.dot
sed -i -e 's/rankdir=LR/rankdir=RL/g' \
-e 's/node \[shape=box\]/node [shape=box, color=black, fillcolor=gray, fontcolor=black, style=filled]/g' \
python3-matplotlib.dot
dot -Tpng img/python3-matplotlib.dot > img/python3-matplotlib.png
echo file:img/python3-matplotlib.png
#+end_src
#+RESULTS:
file:img/python3-matplotlib.png
* M4-S0: Vers une étude reproductible : la réalité du terrain
** L'enfer de la Recherche Reproductible
file:img/phd_sisyphe.png
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
Bonjour à tous,
Maintenant que vous êtes familiers avec les documents computationnels
et les analyses réplicables, vous disposez des outils principaux vous
permettant d'améliorer votre pratique et de rendre votre recherche
reproductible.
Mais la route est longue et semée d'embûches. Il est temps d'aller un
peu plus loin et que vous preniez consciences des différentes
difficultés auxquelles vous risquez d'être confronté.
Dans ce dernier module, nous vous présenterons trois des enfers de la
recherche reproductible.
** Module 4. Vers une étude reproductible : la réalité du terrain :noexport:
1. L'enfer des données
2. L'enfer du logiciel
3. L'enfer du calcul
4. Conclusion
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
\scriptsize
*Christophe:* Le premier enfer est celui des données. Quand on travaille
sur de vrais données, leur taille, leur structure, ou leur diversité
peuvent rapidement poser d'importantes difficultés. Je présenterai
quelques approches permettant de survivre dans cet environnement
hostile.
*Arnaud:* Le second enfer est celui du logiciel et on se trouve
rapidement confronté à deux défis. D'une part, le logiciel devient
très rapidement gros, difficile à gérer, et les solutions simples que
nous vous avons présentées passent alors très mal à
l'échelle. D'autre part, aussi étonnant que cela puisse paraître, les
logiciels vieillissent et résistent souvent très mal à l'épreuve du
temps. Je présenterai des exemples concrets et quelques approches
permettant de survivre dans cet environnement hostile.
*Konrad:* Enfin, le troisième enfer est celui du calcul
numérique. J'illustrerai les difficultés que peut poser le calcul avec
des flottants, ou l'ordre des opérations influe sur les
résultats. Comme cet ordre a aussi un impact sur la performance, il
faut trouver un compromis entre temps d'exécution et
reproductibilité. Ceci est particulièrement difficile pour le calcul
parallèle, qui concerne tous les ordinateurs modernes, même les
smartphones. J'évoquerai aussi les précautions à prendre quand on
utilise les nombres aléatoires.
En espérant ne pas vous avoir trop effrayés, nous concluerons enfin
brièvement ce MOOC par quelques remarques de bon sens.
* M4-S1: L'enfer des données
** Vers une étude reproductible : la réalité du terrain :noexport:
1. *L'enfer des données*
2. L'enfer du logiciel
3. L'enfer du calcul
4. Conclusion
** Deux « nouveaux » problèmes
Lorsque nous commençons à travailler sur de « vraies » données nous nous trouvons généralement confrontés à deux problèmes :
- les données sont de nature « diverse »
- les données occupent un grand espace mémoire
** Les données « non homogènes »
- Les données grippales du module 3 se prêtent bien à une présentation en table (objet à 2 dimensions)
- Souvent la forme table doit être *abandonnée* car :
- les colonnes n'ont pas la même longueur
- les données peuvent être des suites chronologiques *et* des images, etc.
** Les données sont « trop grosses »
- *Format texte* pas toujours approprié pour des nombres
- Choix d'un *format binaire* car :
- Les nombres prennent moins de place mémoire
- Nombres en format texte \Rightarrow conversion en binaire pour calculs
** Ce qu'il faut garder du format texte : les métadonnées
- Le format texte permet de stocker les données *et* tout le reste...
- \Rightarrow ajouter des informations sur les données :
- provenance
- date d'enregistrement
- source
- etc.
- Ces informations sur les données sont ce qu'on appelle les *métadonnées*
- Elles sont vitales pour la mise en œuvre de la recherche reproductible
** Ce qu'il faut garder du format texte : le boutisme
- Format texte « universel »
- Formats binaires dépendent de l'architecture ou de l'OS
- 1010, codé sur 4 bits peut être lu comme :
- 1x1 + 0x2 + 1x4 + 0x8 = 5, c'est le *petit-boutisme*
- 1x8 + 0x4 + 1x2 + 0x1 = 10, c'est le *gros-boutisme*
- *Un stockage binaire pour la recherche reproductible doit spécifier le boutisme*
** Des formats binaires, pour données composites, permettant la sauvegarde de métadonnées
Rechercher des formats binaires pour :
- travailler avec de grosses données de natures différentes
- stocker des métadonnées avec les données
- avoir un boutisme fixé **une fois pour toute**
** `FITS` et `HDF5`
- Le *Flexible Image Transport System* (`FITS`), créé en 1981 est toujours régulièrement mis à jour
- Le *Hierarchical Data Format* (`HDF`), développé au *National Center for Supercomputing Applications*, en est à sa cinquième version, `HDF5`
** `FITS`
- `FITS` introduit et mis à jour par les astrophysiciens
- Format suffisamment général pour utilisation dans différents contextes
** Anatomie d'un fichier `FITS`
- 1 ou plusieurs segments : *Header/Data Units* (HDUs)
- HDU constituée :
- d'une en-tête (*Header Unit*) suivie, *mais ce n'est pas obligatoire*, par
- des données (*Data Unit*)
- En-tête = paires mots clés / valeurs → *métadonnées*
- Données tableaux binaires (une à 999 dimensions) ou tables (texte ou binaire)
** Manipulation des fichiers `FITS`
- Les développeurs du format fournissent une bibliothèque `C` et des programmes associés (faciles à utiliser)
- Les utilisateurs de `Python` pourront utiliser `PyFITS`
- Les utilisateurs de `R` pourront utiliser `FITSio`
** `HDF5`
- Organisation hiérarchique, ressemble à une arborisation de fichiers
- Élément structurant : le *group* (répertoire) contient un ou plusieurs *datasets* (jeux de données)
- Les *groups* peuvent être imbriqués
- Les métadonnées n'ont pas de structure imposée
- Les données n'ont pas de structure imposée — elles peuvent être des textes.
** Manipulation des fichiers `HDF5`
- Format plus souple \Rightarrow bibliothèque `C` plus compliquée que son équivalent `FITS`
- La bibliothèque distribuée avec `HDFView` : outil puissant d'exploration et de visualisation
- `Python` dispose d'une interface très complète avec `h5py`
- Il y a trois paquets `R` : `h5`, `hdf5r` et `rhdf5`
** L'archivage
Git(hub/lab/...) : pas bien adapté au stockage de données
#+BEGIN_CENTER
#+ATTR_LATEX: :height 1cm :center nil
file:img/Zenodo-logo.jpg
#+ATTR_LATEX: :height 1cm :center nil
file:img/Figshare-logo.png
#+END_CENTER
** Conclusions
- Vraies données \Rightarrow problèmes de taille et de structure
- Vraies données complexes \Rightarrow métadonnées
- `FITS` et `HDF5` = solutions *pratiques*
- En complexité et flexibilité : `FITS` < `HDF5`
- Plateformes d'archivage \Rightarrow stockage pérenne accessible à tous
* M4-S2: L'enfer du logiciel
** Vers une étude reproductible : la réalité du terrain :noexport:
1. L'enfer des données
2. *L'enfer du logiciel*
3. L'enfer du calcul
4. Conclusion
** Passage à l'échelle
#+ATTR_LATEX: :width \linewidth
file:img/il-marche-mon-programme.jpg
** Des codes complexes...
#+LaTeX: \includegraphics<+>[height=6cm]{img/nb1.png}%
#+LaTeX: \includegraphics<+>[height=6cm]{img/nb2.png}%
#+LaTeX: \includegraphics<+>[height=6cm]{img/nb3.png}%
#+LaTeX: \includegraphics<+>[height=6cm]{img/nb4.png}%
#+LaTeX: \includegraphics<+>[height=6cm]{img/grippal_orgmode1.png}%
#+LaTeX: \includegraphics<+>[height=6cm]{img/grippal_orgmode2.png}%
#+LaTeX: \includegraphics<+>[height=6cm]{img/nb5.png}%
- Un vrai plat de spaghettis
- Pas de vision d'ensemble
- Interaction entre plusieurs langages = danger
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
- Des codes compliqués à organiser/orchestrer. Le notebook a ses
limitations et vous pouvez en devenir prisonnier.
** ... et difficiles à orchestrer
#+LaTeX: \only<1>{\begin{overlayarea}{1.5\linewidth}{7cm}
#+ATTR_LATEX: :height 7cm :center nil
file:img/SbmlParameterisation.png
#+ATTR_LATEX: :height 7cm :center nil
file:img/SbmlModelling.png
#+LaTeX: \end{overlayarea}}\pause
Le *Workflow* :
- Vue de haut niveau plus claire
- Compositions de codes et mouvements de données explicites
- Partage, réutilisation, et exécution plus sûre
- Le notebook en est une forme à la fois appauvrie et plus riche
- Pas de façon simple/mature de passer d'un notebook à un
workflow
*Exemples* :
- Galaxy, Kepler, Taverna, Pegasus, Collective Knowledge, VisTrails
- Légers : dask, drake, swift, snakemake...
- Hybrides : SOS-notebook...
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
\scriptsize
- un workflow, c'est quoi ? On restructure le code de façon à rendre
le flot de traitement plus explicite. Chaque bout de code est
encapsulé dans une fonction, on supprime les effets de bord pour que
les entrées et les sorties soient parfaitement identifiées. On
connecte ensuite chacune de ces fonctions les unes avec les
autres.
- Un environnement de workflow fournit les bonnes abstractions, les
bonnes conventions d'écritures permettant d'orchestrer tous ces
appels et c'est ensuite le moteur de workflow qui gère l'exécution
des choses. Non seulement le workflow peut plus facilement exploiter
une machine parallèle, mais en plus, il est possible de sauvegarder
l'état d'avancement du calcul (via les données générées jusqu'ici)
et le reprendre plus tard. Si on décide de modifier une des briques
du workflow, on peut réutiliser les résultats obtenus en amont. Ce
genre de manipulation est bien plus compliquée avec un notebook où
il y a une session, un état global et où le risque d'erreur est bien
plus important.
- Alors, un workflow peut devenir quelque chose de très compliqué et
de pas forcément très clair non plus mais la représentation par un
graphe permet de regrouper et d'agréger certaines parties pour se
concentrer sur l'essentiel tout en pouvant inspecter les détails
quand on le souhaite.
- Un autre avantages du workflow est la capacité à partager des
parties du workflow avec d'autres et à bénéficier des améliorations
que d'autres pourraient apporter à notre propre workflow... C'est un
des intérêt de plates-formes comme taverna ou kepler.
- Le notebook est donc selon moi parfait quand on met quelque chose au
point car il permet de prendre des notes sur ce que l'on fait
et sur pourquoi on le fait. Au fur et à mesure que le notebook
évolue en quelque chose de plus complexe et qu'on a les idées de
plus en plus claires sur les manipulations de données à effectuées,
il devient intéressant de transformer toute cette matière en un
workflow.
- Cette restructuration est manuelle et il n'existe pas encore de
bonne solution pour passer de l'un à l'autre. Il y a des tentatives
intéressantes comme le sos-notebook dans Jupyter mais toutes ces
initiatives sont encore en plein développement.
- L'utilisation d'un workflow ne rend pas l'utilisation d'un notebook
caduque. Le notebook est utile mais à un autre niveau. Les appels au
workflow peuvent parfaitement être faits à partir du notebook et on
utilisxe alors ce dernier pour décrire les expériences que l'on mène
et le résultats des analyses.
** L'usine à gaz des calculs coûteux
Les *calculs interminables* et les *gros volumes de données*
- JupyterHub et les supercalculateurs : en développement
- Checkpoint et Cache
- Le workflow permet de passer à l'échelle
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
\scriptsize
# https://zonca.github.io/2015/04/jupyterhub-hpc.html
# https://github.com/ipython/ipyparallel/issues/167
# https://groups.google.com/forum/#!topic/jupyter/BlexhV8W5TE
Les calculs interminables et les gros volumes de données
- JupyterHub et les supercalculateurs: en développement
- Lancement sur des machines distantes ? Compliqué, pas de bonnes
solutions à l'heure actuelle.
- Actuellement, JupyterHub permet de donner une machine
(éventuellement virtuelle) à chaque notebook
- Il dispose également d'un onglet cluster permettant d'allouer
plusieurs machines à un Ipython parallèle.
- Lorsque l'on souhaite paralléliser c'est la plupart du temps le
langage du notebook qui fait le travail (Ipython parallèle, R au
dessus de spark, etc.), pas le notebook lui même.
- Notebook idéal selon moi: tel bloc peut/doit s'exécuter ailleurs
- Ce qui n'est pas sans poser de nombreux problèmes de sémantiques
(surtout si le mécanisme de session est utilisé et/ou que
plusieurs langages sont utilisés)
- Checkpoint et Cache:
- Il y a des mécanismes de cache dans les trois environnements que
nous vous avons présentés.
- Cela vous permet de ne pas tout réexécuter depuis le début.
- Ne pas confondre l'objet résultant (le graphique ou le tableau) des
données sous-jacentes.
- Un checkpoint explicite (via des fichiers) des données nécessaires
à la suite des calculs est la méthode la plus simple.
- Le workflow gère la séparation des codes et des données, ce qui
permet de passer à l'échelle
# - Histoire de montrer que malgré ça c'est dur:
# https://github.com/IFB-ElixirFr/ReproHackathon/blob/master/docs/index.md
# https://f1000research.com/articles/6-124/v1
** Des éco-systèmes complexes
Que se cache-t-il derrière ce simple
#+begin_src python :results output :exports both
import matplotlib
#+end_src
#+LaTeX: \scriptsize
#+BEGIN_EXAMPLE
Package: python3-matplotlib
Version: 2.1.1-2
Depends: python3-dateutil, python-matplotlib-data (>= 2.1.1-2),
python3-pyparsing (>= 1.5.6), python3-six (>= 1.10), python3-tz,
libjs-jquery, libjs-jquery-ui, python3-numpy (>= 1:1.13.1),
python3-numpy-abi9, python3 (<< 3.7), python3 (>= 3.6~),
python3-cycler (>= 0.10.0), python3:any (>= 3.3.2-2~), libc6 (>=
2.14), libfreetype6 (>= 2.2.1), libgcc1 (>= 1:3.0), libpng16-16 (>=
1.6.2-1), libstdc++6 (>= 5.2), zlib1g (>= 1:1.1.4)
#+END_EXAMPLE
#+LaTeX: \only<2>{\vspace{-3.5cm}\includegraphics<2>[width=\linewidth]{img/python3-matplotlib.png}}\vspace{10cm}
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
\scriptsize
- Qu'est-ce qui se cache derrière matplotlib
- Python peut nous dire ce qu'il en sait (i.e., pas grand chose)
mais comment s'assurer que deux personnes exécutent bien ce code
dans le même environnement logiciel
- Dans le cadre de ce MOOC, un serveur jupyter est déployé et un
environnemnt commun est proposé. Mais pouvez vous vous assurer que
vous disposerez du même environnemnt chez vous à la fin du MOOC ?
- Comment réinstaller un tel environnemnent ? Comment packager un
logiciel complexe ?
- Comment faire en sorte qu'il puisse évoluer si un bug est corrigé ?
** Des éco-systèmes complexes
\small Pas de standard:
- Linux (=apt=, =rpm=, =yum=), MacOS X (=brew=, =McPorts=, =Fink=), Windows (?)
#+LaTeX: \null\vspace{-.6em}
- Ni pour l'installation ni pour récupérer les informations... $\frowny$
#+LaTeX: \null\vspace{-.6em}
#+LaTeX: \vspace{-1em}
#+LaTeX: \begin{columns}\begin{column}[t]{.45\linewidth}\scriptsize
#+begin_src python :results output :exports both
import sys
print(sys.version)
import matplotlib
print(matplotlib.__version__)
import pandas as pd
print(pd.__version__)
#+end_src
#+LaTeX: ~\vspace{-2.4em}~\tiny
#+begin_example
3.6.3 (default, Oct 3 2017, 21:16:13)
[GCC 7.2.0]
2.1.1
0.20.3
#+end_example
#+LaTeX: \end{column}\begin{column}[t]{.55\linewidth}\scriptsize
#+begin_src R :results output :session *R* :exports both
library(ggplot2)
sessionInfo()
#+end_src
#+LaTeX: ~\vspace{-2.4em}~\tiny
#+RESULTS:
#+begin_example
R version 3.4.3 (2017-11-30)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Debian GNU/Linux buster/sid
Matrix products: default
BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.7.1
LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.7.1
locale:
[1] LC_CTYPE=fr_FR.UTF-8 LC_NUMERIC=C
[3] LC_TIME=fr_FR.UTF-8 LC_COLLATE=fr_FR.UTF-8
[5] LC_MONETARY=fr_FR.UTF-8 LC_MESSAGES=fr_FR.UTF-8
other attached packages:
[1] ggplot2_2.2.1
loaded via a namespace (and not attached):
[1] colorspace_1.3-2 scales_0.5.0 compiler_3.4.3 lazyeval_0.2.1
[5] plyr_1.8.4 pillar_1.1.0 gtable_0.2.0 tibble_1.4.2
[9] Rcpp_0.12.15 grid_3.4.3 rlang_0.1.6 munsell_0.4.3
#+end_example
#+LaTeX: \end{column}\end{columns}
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
\scriptsize
- Pas de standard:
- Ni pour l'installation ni pour récupérer les informations:
- Linux (Debian =apt=, RedHat =rpm=...), MacOS X (=brew=, =McPorts=,
=Fink=), Windows (?)
- Indiquer ses dépendances logicielles, c'est la version 0 de la
reproductibilité. Ça ne coûte pas bien cher et ça permettra à
celui qui viendra après vous de savoir par où commencer.
- Il faut mettre en place une solution ad hoc, selon le langage
utilisé et ce n'est pas simple.
- Lister l'intégralité de ses dépendances logicielles (voire avec
quel compilateur telle bibliothèque a été compilée) peut être très
compliqué
** Contrôler son environnement
*Un environnement contrôlé :*
- Travailler dans une machine virtuelle (lourd) ou un conteneur docker
(léger)
#+LaTeX: \bigskip\begin{columns}\begin{column}[t]{.45\linewidth}
*Conserver le bazar*
- Capture automatique de l'environnement
- [[http://www.pgbovine.net/cde.html][CDE]], [[https://vida-nyu.github.io/reprozip/][ReproZip]], +[[http://reproducible.io/][CARE]]+
#+LaTeX: \end{column}\hspace{-2em}\begin{column}[t]{.52\linewidth}
*Faire le ménage*
- Partir d'un environnement vierge
- Installer uniquement le nécessaire (et l'expliciter)
- [[https://www.docker.io/][Docker]], [[https://singularity.lbl.gov/][Singularity]], [[https://www.gnu.org/software/guix/][Guix]], [[https://nixos.org/][Nix]]...
#+LaTeX: \end{column}\end{columns}
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
\scriptsize
- Intro:
- You cannot expect people to find all the chains of dependencies!
- You cannot expect people to install all the dependencies and run your
code smoothly!
- Règle numéro 1 d'un environnement bien contrôlé: travailler dans un
environnement isolé (une machine virtuelle ou bien un conteneur)
- Brève explication de ce que c'est et de la différence. Sans le
savoir, tous ceux qui ont utilisé nos notebooks ont travaillé dans
un conteneur docker.
- Conséquence:
- du point de vue du code exécuté, tout est encapsulé: rien ne
rentre, rien ne sort
- l'utilisation de l'interface graphique peut être un peu compliquée
- exécution a priori possible sur n'importe quel OS (pour une VM,
sur un OS compatible pour un conteneur)
- Un environnement contrôlé: deux approches
- Conserver le bazar ::
- C'est l'approche toute automatique, un outil se charge
d'observer l'exécution de votre logiciel et de capturer
l'ensemble des codes et des bibliothèques utilisées
- Une archive contenant l'environnement peut alors être construite
et partagée. C'est très facile et très pratique.
- Avantage: Facile, permet à quelqu'un d'autre de réexécuter le
code dans les mêmes conditions
- Inconvénient: pas facile de faire évoluer un tel objet, ni de
comprendre comment il fonctionne. Le résultat est une boite
noire.
- Examples: CARE, CDE, Reprozip
- Faire le ménage ::
- On part d'un environnement minimal dans un conteneur
- On rajoute les composants logiciel dont on a besoin au fur et à
mesure
- Idéalement, au fur et à mesure qu'on rajoute ces logiciel, on
scripte leur installation (e.g., dockerfile)
- Avantage: cela permettra de facilement faire évoluer
l'environnement (mise à jour, remplacement d'un composant
défectueux, etc.)
- Inconvénient: demande quelques efforts, en particulier quand les
composants logiciels sont mal packagés (pas partie d'une
distribution, interventions manuelles, etc.) et que beaucoup
d'interactions avec l'extérieur sont nécessaires (le téléchargement
des données doit être bien séparé)
- Examples: Singularity, voire Nix ou GUIX qui permettent une
reconstruction parfaite, un environnement étant encodé de façon
fonctionnel
*** Cruft :noexport:
#+begin_src shell :results output raw :exports both
echo "#+BEGIN_EXAMPLE"
apt-cache show python3-matplotlib # | grep Depends | head -1
echo "#+END_EXAMPLE"
#+end_src
#+RESULTS:
#+BEGIN_EXAMPLE
Package: python3-matplotlib
Source: matplotlib
Version: 2.1.1-2
Installed-Size: 12159
Maintainer: Sandro Tosi <morph@debian.org>
Architecture: amd64
Depends: python3-dateutil, python-matplotlib-data (>= 2.1.1-2), python3-pyparsing (>= 1.5.6), python3-six (>= 1.10), python3-tz, libjs-jquery, libjs-jquery-ui, python3-numpy (>= 1:1.13.1), python3-numpy-abi9, python3 (<< 3.7), python3 (>= 3.6~), python3-cycler (>= 0.10.0), python3:any (>= 3.3.2-2~), libc6 (>= 2.14), libfreetype6 (>= 2.2.1), libgcc1 (>= 1:3.0), libpng16-16 (>= 1.6.2-1), libstdc++6 (>= 5.2), zlib1g (>= 1:1.1.4)
Recommends: python3-pil, python3-tk
Suggests: dvipng, ffmpeg, gir1.2-gtk-3.0, ghostscript, inkscape, ipython3, librsvg2-common, python-matplotlib-doc, python3-cairocffi, python3-gi, python3-gi-cairo, python3-gobject, python3-nose, python3-pyqt4, python3-scipy, python3-sip, python3-tornado, texlive-extra-utils, texlive-latex-extra, ttf-staypuft
Enhances: ipython3
Description-fr: système de traçage basé sur Python dans un style similaire à celui Matlab –⋅Python⋅3
Matplotlib est une bibliothèque de traçage en Python pur conçue pour
apporter à Python des capacités de traçage d'une qualité adaptée à la
publication, avec une syntaxe familière aux utilisateurs de Matlab. L'accès
à toutes les commandes de traçage, dans l'interface pylab, est possible
soit à travers une interface fonctionnelle familière aux utilisateurs de
Matlab, soit à travers une interface orientée objet familière à ceux de Python.
.
Ce paquet fournit la version Python⋅3 de matplotlib.
Description-md5: 29e115db1f22ec2264a195b584329de9
Homepage: http://matplotlib.org/
Section: python
Priority: optional
Filename: pool/main/m/matplotlib/python3-matplotlib_2.1.1-2_amd64.deb
Size: 4597588
MD5sum: bfca8169a6b4e2cd9f89eb2f862083c7
SHA256: cbf80fdbf2643f19f926e33ea24cab3f76286d631d0806a2f665989fb17c76e4
Package: python3-matplotlib
Source: matplotlib
Version: 2.0.0+dfsg1-2
Installed-Size: 7362
Maintainer: Sandro Tosi <morph@debian.org>
Architecture: amd64
Depends: python3-dateutil, python-matplotlib-data (>= 2.0.0+dfsg1-2), python3-pyparsing (>= 1.5.6), python3-six (>= 1.10), python3-tz, libjs-jquery, libjs-jquery-ui, python3-numpy (>= 1:1.10.0~b1), python3-numpy-abi9, python3 (<< 3.6), python3 (>= 3.5~), python3-cycler (>= 0.10.0), python3:any (>= 3.3.2-2~), libc6 (>= 2.14), libfreetype6 (>= 2.2.1), libgcc1 (>= 1:3.0), libpng16-16 (>= 1.6.2-1), libstdc++6 (>= 5.2)
Recommends: python3-pil, python3-tk
Suggests: dvipng, ffmpeg, gir1.2-gtk-3.0, ghostscript, inkscape, ipython3, librsvg2-common, python-matplotlib-doc, python3-cairocffi, python3-gi, python3-gi-cairo, python3-gobject, python3-nose, python3-pyqt4, python3-scipy, python3-sip, python3-tornado, texlive-extra-utils, texlive-latex-extra, ttf-staypuft
Enhances: ipython3
Description-fr: système de traçage basé sur Python dans un style similaire à celui Matlab –⋅Python⋅3
Matplotlib est une bibliothèque de traçage en Python pur conçue pour
apporter à Python des capacités de traçage d'une qualité adaptée à la
publication, avec une syntaxe familière aux utilisateurs de Matlab. L'accès
à toutes les commandes de traçage, dans l'interface pylab, est possible
soit à travers une interface fonctionnelle familière aux utilisateurs de
Matlab, soit à travers une interface orientée objet familière à ceux de Python.
.
Ce paquet fournit la version Python⋅3 de matplotlib.
Description-md5: 29e115db1f22ec2264a195b584329de9
Homepage: http://matplotlib.org/
Section: python
Priority: optional
Filename: pool/main/m/matplotlib/python3-matplotlib_2.0.0+dfsg1-2_amd64.deb
Size: 1589544
MD5sum: e8f0571243df303a9b1f37a8ebf8177d
SHA256: 8f5d3509d4f5451468c6de44fc8dfe391c3df4120079adc01ab5f13ff4194f5a
#+END_EXAMPLE
** L'épreuve du temps
file:img/soviet_space_shuttle.jpg
** Compatibilité ascendante
\small
- Python et tout son écosystème à évolution hyper rapide
#+LaTeX: \null\vspace{-1em}
#+begin_src shell :results output :exports both
python2 -c "print(10/3)"
python3 -c "print(10/3)"
#+end_src
#+LaTeX: \null\vspace{-2.4em}{\scriptsize
#+RESULTS:
: 3
: 3.3333333333333335
#+LaTeX: }
\pause
#+ATTR_LATEX: :height 3.2cm :center nil
file:img/plot_1.5.3.png
#+ATTR_LATEX: :height 3.2cm :center nil
file:img/plot_2.1.1.png
\pause
- Cortical Thickness Measurements (PLOS ONE,
June 2012): /FreeSurfer/: /differences were found between the Mac and
HP workstations and between Mac OSX 10.5 and OSX 10.6./
- Incompatibilité de formats entre orgmode 7.*, 8.*, 9.*, etc.
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
\scriptsize
- Petit exemple en python, le plus simple qui soit, une division:
- Le passage de python2 à python3 a introduit des changements
majeurs puisque la division par défaut qui était à l'origine une
division entière est devenue une division sur des flottants.
- Alors, certains diront que python2 et python3 doivent être
considérés comme deux langages distincts mais même si python2
reste maintenu et continue d'évoluer (doucement), quand tous les
efforts de l'écosystème se tournent vers python3, on est bien
obligé d'emboiter le pas...
- Il y a quelques mois, un de mes collègues qui était bien content
d'avoir utilisé un notebook pour préparer son dernier article et
d'avoir fait bien attention à sauvegarder tout son code et ses
résultats intermédiaires, a été assez surpris en préparant la
révision finale de remarquer que la figure qu'il avait générée 3
mois auparavant avait décidé de changer de couleurs...
- Entre les deux, matplotlib a été mis à jour sur sa machine et il
se trouve qu'entre la version 1.5.12 et la 2.0, la palette de
couleurs par défaut a changé...
- Alors, dans cet exemple précis, ça ne change pas
fondamentalement les choses et le plus important était de
pouvoir mettre à disposition la démarche utilisée mais c'est
quand même assez agaçant.
- Ce type d'incident met en évidence le problème de la perméabilité
à l'environnement extérieur.
** Les outils à développement rapide
*Rapides*, mais *fragiles* et *peu pérennes* :
- Correction ou introduction de bug
- Il devient nécessaire de vérifier régulièrement la
reconstructibilité et la fonctionnalité de ces environnements
(intégration continue et tests de non régression)
Popper: [[http://falsifiable.us/][http://falsifiable.us/]]
#+ATTR_LATEX: :height 1.5cm :center nil
file:img/popper_logo_just_jug.png
*Autre possibilité* :
- Se restreindre à ce qui est maîtrisable (C par exemple)
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
- Les outils informatiques évoluent à une vitesse incroyable et nous
permettent d'aller plus vite, plus loin dans nos recherche. Il est
donc indispensable de s'appuyer dessus.
- Néanmoins, ces développements rapides sont aussi a source de
nombreuses erreurs, de régressions, de corrections (ce qui est une
bonne chose) et très souvent de perte de compatibilité entre les
versions.
- Ce sont des outils à développement rapide dans les deux sens du
terme, c'est à dire des outils qui à la fois vous permettent de
mettre en place des choses complexes très rapidement mais qui
évoluent aussi très (pour ne pas dire trop) rapidement.
- Dans ce contexte mouvant, il devient nécessaire de vérifier
régulièrement que notre code et son environnement peuvent être
regénérés et qu'ils sont fonctionnels. En génie logiciel, les termes
associés sont "intégration continue" (chaque nuit ou bien à chaque
commit dans votre gestionnaire de version, la compilation de votre
code est déclenchée et remonte une alerte en cas de problème) et
"tests de non régression" (une fois votre code et son environnement
compilé, on vérifie via une batterie de tests que les sorties pour
des entrées bien spécifiques sont toujours correctes).
- Certains proposent même une utilisation systématique de ce type
d'approche au processus de recherche. Ça demande un investissement
technique un peu lourd mais dans le principe, pourquoi pas ?
- Il faut garder à l'esprit que les notebooks ou les outils que nous
vous avons présentés font d'ailleurs partie de cette famille
d'outils à développement rapide et n'échappent pas malgré leurs
efforts à ces difficultés de pérennité.
- Pour être le moins possible ennuyé par ce type de problème, certains
font le choix de se restreindre à des outils et des langages très
stables et qu'ils peuvent maîtriser de bout en bout.
- Il faut donc trouver le bon compromis entre modernisme et pérennité.
** L'archivage
*Gestion du code source*
- Github/Gitlab/... : stables, ouverts, \dots pérennes ?
- +Google Code+, +Gitorious+, +Code Spaces+
#+ATTR_LATEX: :height 1.3cm :center nil
file:img/swh-logo.png
#+ATTR_LATEX: :height 1.3cm :center nil
file:img/LogoHAL.png
*Gestion des environnements*
- Pérénité de l'accès à dockerhub, nix repository, code ocean... ?
- Une fois l'environnement gelé, quelle est la pérennité d'une VM,
d'une image docker... ?
*Conserver le plus d'informations possible en automatisant*
- Logiciels, versions, procédure d'installation
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
- Dans les exercices, faites y bien attention.
# file:img/ArXiv-web.png" height=60 />
# file:img/Zenodo-logo.jpg" height=60 />
# file:img/Figshare-logo.png" height=60 />
* M4-S3: L'enfer du calcul
** Vers une étude reproductible : la réalité du terrain :noexport:
1. L'enfer des données
2. L'enfer du logiciel
3. *L'enfer du calcul*
4. Conclusion
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
Dans cette séquence, nous montrons les difficultés spécifiques qu'on
rencontre dans le calcul numérique. La plus fréquente est due à
l'arithmétique à virgule flottante, ce qui est un cas spécial de la
variabilité entre les plateformes de calcul. Une autre difficulté
est due aux générateurs de nombres aléatoires.
** L'arithmétique à virgule flottante
file:img/polynome1.svg
#+begin_src python :results output :exports both
def polynome(x):
return x**9 - 9.*x**8 + 36.*x**7 - 84.*x**6 + 126.*x**5 \
- 126.*x**4 + 84.*x**3 - 36.*x**2 + 9.*x - 1.
#+end_src
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
Commençons avec un exemple. Mon collègue Arnaud a calculé les valeurs d'un
polynôme d'ordre 9. Le voici.
** L'arithmétique à virgule flottante
file:img/polynome2.svg
#+begin_src python :results output :exports both
def horner(x):
return x*(x*(x*(x*(x*(x*(x*(x*(x - 9.) + 36.) - 84.) + 126.) \
- 126.) + 84.) - 36.) + 9.) - 1.
#+end_src
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
Mon collègue Christophe lui fait remarquer que la méthode de Horner résulte dans
un calcul plus efficace. Il s'agit d'un réarrangement des termes qui reduit notamment
le nombre de multiplications. Le voici. Les deux courbes se recouvrent, donc les
résultats sont identiques.
** L'arithmétique à virgule flottante
file:img/polynome3.svg
#+begin_src python :results output :exports both
def simple(x):
return (x-1.)**9
# trop facile!
#+end_src
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
Une analyse un peu plus approfondie montre que notre polynôme a une seule racine
à x=1, ce qui nous permet d'en simplifier le calcul. Nous avons maintenant
trois courbes qui se recouvrent. Tout va bien !
** L'arithmétique à virgule flottante
file:img/polynome3-4.svg
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
Mais regardons la région autour de x=1 de plus près...
** L'arithmétique à virgule flottante
file:img/polynome4.svg
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
Ça a l'air un peu bizarre. Et les trois courbes ne sont enfin pas identiques,
juste proches. Qu'est-ce qui se passe ?
** L'arrondi
#+LaTeX: \def\round{\texttt{arrondi}}
- Il y a un arrondi implicite dans chaque opération.
- a+b est en réalité \round(a+b).
- Mais:
#+BEGIN_CENTER
\small
\round(\round(a+b)+c) $\ne$ \round(a+\round(b+c)).
#+END_CENTER
- L'ordre des opérations est donc important.
*Pour un calcul reproductible, il faut préserver l'ordre des
opérations !!!*
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
Le résultat d'une opération arithmétique sur des flottant n'est en général pas
représentable par un autre flottant. On applique une opération d'arrondi qui
remplace le résultat exact avec une valeur proche qui est représentable.
A cause de l'arrondi, les règles habituelles de l'arithmétique ne sont plus
applicables à l'identique. On perd notamment l'associativité de l'addition et
de la multiplication.
En changeant l'ordre des opérations, on peut donc changer le résultat !
** Comment l'expliquer à mon compilateur?
Pour accélérer le calcul, les compilateurs peuvent changer l'ordre des opérations,
et donc le résultat.
Pour un calcul reproductible, il y a deux approches:
- Insister sur le respect de l'ordre des opérations,
+ si le langage le permet.
+ Exemple: Le module `ieee_arithmetic` en Fortran 2003
- Rendre la compilation reproductible:
- Noter la version précise du compilateur
- Noter toutes les options de compilation
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
Ceci devient un obstacle à la reproductibilité à cause des
optimisations appliquées par les compilateurs pour accélérer le
calcul. Celle-ci changent souvent l'ordre des opérations et donc le
résultat.
Pour rendre un calcul reproductible, il y a deux
approches. Premièrement, on peut dire à son compilateur de ne pas
toucher à l'ordre des opérations, idéalement dans le code source du
logiciel. Ceci est possible par exemple dans le langage Fortran
2003.
L'autre approche est de rendre la compilation elle-même
reproductible en notant la version précise du compilateur utilisé,
ainsi que toutes les options de compilation. Idéalement, il faut
alors archiver le compilateur avec le logiciel de calcul.
** Calcul parallèle
- Objectif: une exécution plus rapide
\to Minimiser la communication entre processeurs
\to Adapter la répartition des données...
\to et donc l'ordre des opérations
- Conséquence: le résultat dépend du nombre de processeurs!
*Minimiser cet impact du parallélisme reste un sujet de recherche.*
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
Un autre obstacle à la reproductibilité résulte du calcul parallèle.
Celui-ci a comme seul objectif une exécution plus rapide. Pour y arriver,
il faut minimiser la communication entre les processeurs en adaptant
la répartition des données. Ceci implique d'adapter l'ordre des opérations,
car chaque processeur traite d'abord ses données locales avant d'entrer en
communication avec les autres processeurs.
La conséquence est que le résultat du calcul change avec le nombre
de processeurs utilisés.
On peut tenter d'écrire le logiciel tel que l'impact de cette variation
soit minimisé. Mais il n'y a pour l'instant aucune technique éprouvée
pour y arriver. Ceci reste un sujet de recherche.
** Calcul parallèle: exemple
file:img/gouttedo1.png
Source: Thèse de Rafife Nheili, Université de Perpignan, 2016
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
Regardons un simple exemple: la simulation des vagues causées dans
un bassin carré d'eau par une goutte qui tombe au milieu. A gauche,
la simulation exécutée sur un seul processeur. A droite, le résultat
d'un calcul sur quatre proecesseurs, ou les points qui diffèrent
sont colorés en gris.
** Calcul parallèle: exemple
file:img/gouttedo2.png
Source: Thèse de Rafife Nheili, Université de Perpignan, 2016
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
Un pas de temps plus loin, le nombre de points à résultat différent
a nettement augmenté. Il continuera a augmenter au cours de la
simulation, jusqu'à ce qu'il n'y a plus aucun point pour lequel le
résultat restera identique.
** Les plateformes de calcul
- Plateforme de calcul: matériel + infrastructure logicielle
- Calcul = plateforme + logiciel + données
- La plateforme définit l'interprétation du logiciel.
- Plateforme et logiciel définissent l'interprétation des données.
- Autres aspects définis par la plateforme:
- la représentation des entiers (16/32/64 bits)
- la gestion des erreurs
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
Les obstacles à la reproductibilité dûs à l'arithmétique à virgule flottante
sont un cas spécial important de la dépendance des plateformes. Un logiciel
est écrit dans un langage de programmation, mais l'interprétation précise de
ce langage est définie par la plateforme de calcul utilisé. Celle-ci consiste
du matériel, notamment du processeur, et de l'infrastructure logiciel:
système d'exploitation, compilateurs, etc.
Un calcul est défini par trois ingrédients: la plateforme, le logiciel, et les
données traitées. La plateforme définit comment est interprété le logiciel,
et les deux ensembles définissent comment sont interprétées les donées.
L'arithmétique à virgule flottante est interprétée différemment par les différentes
plateformes de calcul populaires aujourd'hui, mais ce n'est pas le seul point
de divergence. Dans certains langage comme le C ou le Fortran, les entiers sont
aussi concernés car les plateformes leur attribuent des tailles et donc des
intervalles de valeurs différentes. Enfin, les erreurs de calcul, comme par
exemple la division par zéro, ne sont pas gérées de la ême façon par toutes les
plateformes.
** Les nombres aléatoires
- Utilisés pour simuler les processus stochastiques.
- En pratique: nombres *pseudo-* aléatoires.
- Suite de nombres *en apparence* aléatoires...
- ... mais générés par un algorithme déterministe.
** Générateur de nombres pseudo-aléatoires
#+LaTeX: \vspace{1cm}
#+LaTeX: \only<+>{\includesvg[scale=.45]{img/nombres-aleatoires-1.svg}}
#+LaTeX: \only<+>{\includesvg[scale=.45]{img/nombres-aleatoires-2.svg}}
#+LaTeX: \only<+>{\includesvg[scale=.45]{img/nombres-aleatoires-3.svg}}
#+LaTeX: \only<+>{\includesvg[scale=.45]{img/nombres-aleatoires-4.svg}}
#+LaTeX: \vspace{10cm}
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
On part d'un état initial appelé "graine" (typiquement un entier).
Pour générer un nombre, on applique une transformation à cet état,
puis on calcule le nombre comme fonction de cet état.
On repète autant que nécessaire.
** La reproductibilité en théorie
- Principe: même graine + même algorithme → même suite
- La graine est souvent choisie comme fonction de l'heure
- Il faut la définir dans le code d'application
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
En principe, il suffit d'utiliser la même graine et le même algorithme pour
toujours avoir la même suite de nombres.
L'algorithme fait partie d'une librairie, dont il faut noter la version
utilisée. Les librairie de nombres aléatoires choisissent souvent la graine
comme fonction de l'heure, pour donner une apparence "plus aléatoire".
Mais pour la reproductibilité, il faut définir la graine dans le code
d'application.
** La reproductibilité en pratique
- Même graine + même algorithme → même suite:\newline
pas évident en arithmétique à virgule flottante!
- Une astuce simple pour permettre la vérification:\newline
tester quelques valeurs du début de la suite
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
En pratique, il n'est pas si facile d'obtenir une suite identique, même avec
la même version de la même librairie, à cause de la variation dans l'arithmétique
à virgule flottante.
Un astuce simple est de tester quelques valeurs du début de la suite. Si elle ne
sont pas identiques, on sait que la suite a changé.
** Exemple: le langage Python
#+begin_src python :results output :exports both
import random
random.seed(123)
for i in range(5):
print(random.random())
#+end_src
#+LaTeX: \scriptsize
#+RESULTS:
: 0.0523635988509
: 0.0871866775226
: 0.40724176367
: 0.107700234938
: 0.901198877952
#+LaTeX: \vfill
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
Voici l'application de cet astuce en langage Python. On commence par
définir la graine et d'afficher les premières valeurs de la suit de
nombres pseudo-aléatoires.
** Exemple: le langage Python
#+begin_src python :results output :exports both
import random
random.seed(123)
assert random.random() == 0.052363598850944326
assert random.random() == 0.08718667752263232
assert random.random() == 0.4072417636703983
#+end_src
#+RESULTS:
#+LaTeX: \vfill
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
Puis on modifie le code en remplaçant l'affichage des valeurs par des
comparaisons aux valeurs précédemment affichées. En cas de divergence,
le programme s'arrête avec un message d'erreur.
** Les points clés à retenir
- Les résultats d'un calcul dépendent
- du logiciel
- des données d'entrée
- de la plateforme de calcul: matériel, compilateurs...
- L'influence de la plateforme est importante pour l'arithmétique à virgule flottante.
- Notez les paramètres dont peuvent dépendre vos résultats:
- version du compilateur, options de compilation
- matériel (type de processeur, GPU...)
- nombre de processeurs
- En utilisant un générateur de nombres aléatoires, définissez la graine et vérifiez les premiers éléments de la suite.
* M4-S4: Conclusion
** Vers une étude reproductible : la réalité du terrain :noexport:
1. L'enfer des données
2. L'enfer du logiciel
3. L'enfer du calcul
4. *Conclusion*
** Ce qu'il faut retenir de ce MOOC
*Un véritable enjeu*
- Méthodologie scientifique
- Inspectabilité et réutilisation
*Des outils existent*
- Documents computationnels et Workflows, Suivi de version et
Archives, Environnements logiciels, Intégration continue...
- Ces outils évoluent en permanence
- Choisissez ceux qui sont les plus adaptés à votre contexte
- Cherchez un compromis entre modernisme et pérénité
*Mettez en pratique, ne vous découragez pas!*
- Prenez des notes rigoureusement
- Rendez l'information exploitable et accessible
- Améliorez petit à petit
* Emacs Setup :noexport:
This document has local variables in its postembule, which should
allow Org-mode (9) to work seamlessly without any setup. If you're
uncomfortable using such variables, you can safely ignore them at
startup. Exporting may require that you copy them in your .emacs.
# Local Variables:
# eval: (add-to-list 'org-latex-packages-alist '("" "minted"))
# eval: (setq org-latex-listings 'minted)
# eval: (setq org-latex-minted-options '(("style" "Tango") ("bgcolor" "Moccasin") ("frame" "lines") ("linenos" "true") ("fontsize" "\\scriptsize")))
# eval: (setq org-latex-pdf-process '("pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f"))
# End:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="199.75809mm"
height="56.37635mm"
viewBox="0 0 199.75809 56.37635"
version="1.1"
id="svg3797"
inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
sodipodi:docname="nombres-aleatoires-1.svg">
<defs
id="defs3791">
<marker
inkscape:isstock="true"
style="overflow:visible"
id="marker6467"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow2Mend">
<path
transform="scale(-0.6)"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
id="path6465"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow2Mend"
orient="auto"
refY="0"
refX="0"
id="marker5388"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path5386"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="scale(-0.6)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow2Send"
orient="auto"
refY="0"
refX="0"
id="Arrow2Send"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4771"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="matrix(-0.3,0,0,-0.3,0.69,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow2Mend"
orient="auto"
refY="0"
refX="0"
id="Arrow2Mend"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4765"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="scale(-0.6)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Mend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Mend"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4747"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow2Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow2Lend"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4759"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
inkscape:connector-curvature="0" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.94"
inkscape:cx="152.54525"
inkscape:cy="36.537983"
inkscape:document-units="mm"
inkscape:current-layer="g4184"
showgrid="false"
inkscape:window-width="1680"
inkscape:window-height="986"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
fit-margin-top="1"
fit-margin-left="1"
fit-margin-bottom="1"
fit-margin-right="1" />
<metadata
id="metadata3794">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-9.4595477,-34.571133)">
<g
transform="matrix(0.28222223,0,0,0.28222223,7.592776,-17.518982)"
id="g4184">
<g
id="g3855"
transform="translate(-54.374999)">
<rect
style="opacity:1;fill:#edb2b2;fill-opacity:1;stroke:#000000;stroke-width:0.71042091;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4156"
width="121.60297"
height="60.711681"
x="64.888062"
y="188.46979" />
<text
id="text4142"
y="230.61029"
x="77.847748"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:30px;line-height:1"
y="230.61029"
x="77.847748"
id="tspan4144"
sodipodi:role="line">graine</tspan></text>
</g>
</g>
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="199.75809mm"
height="56.37635mm"
viewBox="0 0 199.75809 56.37635"
version="1.1"
id="svg3797"
inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
sodipodi:docname="nombres-aleatoires-2.svg">
<defs
id="defs3791">
<marker
inkscape:isstock="true"
style="overflow:visible"
id="marker6467"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow2Mend">
<path
transform="scale(-0.6)"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
id="path6465"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow2Mend"
orient="auto"
refY="0"
refX="0"
id="marker5388"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path5386"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="scale(-0.6)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow2Mend"
orient="auto"
refY="0"
refX="0"
id="marker5196"
style="overflow:visible"
inkscape:isstock="true"
inkscape:collect="always">
<path
id="path5194"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="scale(-0.6)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow2Send"
orient="auto"
refY="0"
refX="0"
id="Arrow2Send"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4771"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="matrix(-0.3,0,0,-0.3,0.69,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow2Mend"
orient="auto"
refY="0"
refX="0"
id="Arrow2Mend"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4765"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="scale(-0.6)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Mend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Mend"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4747"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow2Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow2Lend"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4759"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
inkscape:connector-curvature="0" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.94"
inkscape:cx="152.54525"
inkscape:cy="36.537983"
inkscape:document-units="mm"
inkscape:current-layer="g4184"
showgrid="false"
inkscape:window-width="1680"
inkscape:window-height="986"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
fit-margin-top="1"
fit-margin-left="1"
fit-margin-bottom="1"
fit-margin-right="1" />
<metadata
id="metadata3794">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-9.4595477,-34.571133)">
<g
transform="matrix(0.28222223,0,0,0.28222223,7.592776,-17.518982)"
id="g4184">
<g
id="g3855"
transform="translate(-54.374999)">
<rect
style="opacity:1;fill:#edb2b2;fill-opacity:1;stroke:#000000;stroke-width:0.71042091;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4156"
width="121.60297"
height="60.711681"
x="64.888062"
y="188.46979" />
<text
id="text4142"
y="230.61029"
x="77.847748"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:30px;line-height:1"
y="230.61029"
x="77.847748"
id="tspan4144"
sodipodi:role="line">graine</tspan></text>
</g>
<g
id="g3860"
transform="translate(-23.750037)">
<rect
y="188.46979"
x="220.51308"
height="60.711681"
width="121.60297"
id="rect3816"
style="opacity:1;fill:#edb2b2;fill-opacity:1;stroke:#000000;stroke-width:0.71042091;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="236.95909"
y="230.61029"
id="text3820"><tspan
sodipodi:role="line"
id="tspan3818"
x="236.95909"
y="230.61029"
style="font-size:30px;line-height:1">état 1</tspan></text>
</g>
<path
style="fill:none;stroke:#000000;stroke-width:3.77362204;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5196)"
d="m 137.77731,218.82563 c 50.86436,0 50.86436,0 50.86436,0"
id="path3931"
inkscape:connector-curvature="0" />
</g>
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="199.75809mm"
height="56.37635mm"
viewBox="0 0 199.75809 56.37635"
version="1.1"
id="svg3797"
inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
sodipodi:docname="nombres-aleatoires-3.svg">
<defs
id="defs3791">
<marker
inkscape:isstock="true"
style="overflow:visible"
id="marker6467"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow2Mend">
<path
transform="scale(-0.6)"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
id="path6465"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:isstock="true"
style="overflow:visible"
id="marker5550"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow2Mend"
inkscape:collect="always">
<path
transform="scale(-0.6)"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
id="path5548"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow2Mend"
orient="auto"
refY="0"
refX="0"
id="marker5388"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path5386"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="scale(-0.6)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow2Mend"
orient="auto"
refY="0"
refX="0"
id="marker5196"
style="overflow:visible"
inkscape:isstock="true"
inkscape:collect="always">
<path
id="path5194"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="scale(-0.6)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow2Send"
orient="auto"
refY="0"
refX="0"
id="Arrow2Send"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4771"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="matrix(-0.3,0,0,-0.3,0.69,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow2Mend"
orient="auto"
refY="0"
refX="0"
id="Arrow2Mend"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4765"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="scale(-0.6)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Mend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Mend"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4747"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow2Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow2Lend"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4759"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
inkscape:connector-curvature="0" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.94"
inkscape:cx="152.54525"
inkscape:cy="36.537983"
inkscape:document-units="mm"
inkscape:current-layer="g4184"
showgrid="false"
inkscape:window-width="1680"
inkscape:window-height="986"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
fit-margin-top="1"
fit-margin-left="1"
fit-margin-bottom="1"
fit-margin-right="1" />
<metadata
id="metadata3794">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-9.4595477,-34.571133)">
<g
transform="matrix(0.28222223,0,0,0.28222223,7.592776,-17.518982)"
id="g4184">
<g
id="g3855"
transform="translate(-54.374999)">
<rect
style="opacity:1;fill:#edb2b2;fill-opacity:1;stroke:#000000;stroke-width:0.71042091;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4156"
width="121.60297"
height="60.711681"
x="64.888062"
y="188.46979" />
<text
id="text4142"
y="230.61029"
x="77.847748"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:30px;line-height:1"
y="230.61029"
x="77.847748"
id="tspan4144"
sodipodi:role="line">graine</tspan></text>
</g>
<g
id="g3860"
transform="translate(-23.750037)">
<rect
y="188.46979"
x="220.51308"
height="60.711681"
width="121.60297"
id="rect3816"
style="opacity:1;fill:#edb2b2;fill-opacity:1;stroke:#000000;stroke-width:0.71042091;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="236.95909"
y="230.61029"
id="text3820"><tspan
sodipodi:role="line"
id="tspan3818"
x="236.95909"
y="230.61029"
style="font-size:30px;line-height:1">état 1</tspan></text>
</g>
<path
style="fill:none;stroke:#000000;stroke-width:3.77362204;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5196)"
d="m 137.77731,218.82563 c 50.86436,0 50.86436,0 50.86436,0"
id="path3931"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
id="path5546"
d="m 261.46264,255.77267 c 0.55356,50.86135 0.55356,50.86135 0.55356,50.86135"
style="fill:none;stroke:#000000;stroke-width:3.77362204;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5550)" />
<rect
y="319.76712"
x="182.80771"
height="60.617012"
width="156.41521"
id="rect6260"
style="opacity:1;fill:#9bc762;fill-opacity:1;stroke:#000000;stroke-width:0.80508971;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="188.79851"
y="361.86029"
id="text6264"><tspan
sodipodi:role="line"
id="tspan6262"
x="188.79851"
y="361.86029"
style="font-size:30px;line-height:1">nombre 1</tspan></text>
</g>
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="199.75809mm"
height="56.37635mm"
viewBox="0 0 199.75809 56.37635"
version="1.1"
id="svg3797"
inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
sodipodi:docname="nombres-aleatoires-4.svg">
<defs
id="defs3791">
<marker
inkscape:isstock="true"
style="overflow:visible"
id="marker6467"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow2Mend">
<path
transform="scale(-0.6)"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
id="path6465"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow2Mend"
orient="auto"
refY="0"
refX="0"
id="marker6319"
style="overflow:visible"
inkscape:isstock="true"
inkscape:collect="always">
<path
id="path6317"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="scale(-0.6)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:isstock="true"
style="overflow:visible"
id="marker5550"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow2Mend"
inkscape:collect="always">
<path
transform="scale(-0.6)"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
id="path5548"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow2Mend"
orient="auto"
refY="0"
refX="0"
id="marker5388"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path5386"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="scale(-0.6)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:isstock="true"
style="overflow:visible"
id="marker5262"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow2Mend"
inkscape:collect="always">
<path
transform="scale(-0.6)"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
id="path5260"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow2Mend"
orient="auto"
refY="0"
refX="0"
id="marker5196"
style="overflow:visible"
inkscape:isstock="true"
inkscape:collect="always">
<path
id="path5194"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="scale(-0.6)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow2Send"
orient="auto"
refY="0"
refX="0"
id="Arrow2Send"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4771"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="matrix(-0.3,0,0,-0.3,0.69,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow2Mend"
orient="auto"
refY="0"
refX="0"
id="Arrow2Mend"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4765"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="scale(-0.6)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Mend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Mend"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4747"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow2Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow2Lend"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4759"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
inkscape:connector-curvature="0" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.94"
inkscape:cx="152.54525"
inkscape:cy="36.537983"
inkscape:document-units="mm"
inkscape:current-layer="g4184"
showgrid="false"
inkscape:window-width="1680"
inkscape:window-height="986"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
fit-margin-top="1"
fit-margin-left="1"
fit-margin-bottom="1"
fit-margin-right="1" />
<metadata
id="metadata3794">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-9.4595477,-34.571133)">
<g
transform="matrix(0.28222223,0,0,0.28222223,7.592776,-17.518982)"
id="g4184">
<g
id="g3855"
transform="translate(-54.374999)">
<rect
style="opacity:1;fill:#edb2b2;fill-opacity:1;stroke:#000000;stroke-width:0.71042091;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4156"
width="121.60297"
height="60.711681"
x="64.888062"
y="188.46979" />
<text
id="text4142"
y="230.61029"
x="77.847748"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:30px;line-height:1"
y="230.61029"
x="77.847748"
id="tspan4144"
sodipodi:role="line">graine</tspan></text>
</g>
<g
id="g3860"
transform="translate(-23.750037)">
<rect
y="188.46979"
x="220.51308"
height="60.711681"
width="121.60297"
id="rect3816"
style="opacity:1;fill:#edb2b2;fill-opacity:1;stroke:#000000;stroke-width:0.71042091;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="236.95909"
y="230.61029"
id="text3820"><tspan
sodipodi:role="line"
id="tspan3818"
x="236.95909"
y="230.61029"
style="font-size:30px;line-height:1">état 1</tspan></text>
</g>
<g
id="g3865"
transform="translate(6.8750093)">
<rect
style="opacity:1;fill:#edb2b2;fill-opacity:1;stroke:#000000;stroke-width:0.71042091;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect3824"
width="121.60297"
height="60.711681"
x="376.13806"
y="188.46979" />
<text
id="text3828"
y="230.61029"
x="392.58408"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:30px;line-height:1"
y="230.61029"
x="392.58408"
id="tspan3826"
sodipodi:role="line">état 2</tspan></text>
</g>
<g
id="g3870"
transform="translate(37.499999)">
<rect
y="188.46979"
x="531.76306"
height="60.711681"
width="121.60297"
id="rect3832"
style="opacity:1;fill:#edb2b2;fill-opacity:1;stroke:#000000;stroke-width:0.71042091;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="548.20911"
y="230.61029"
id="text3836"><tspan
sodipodi:role="line"
id="tspan3834"
x="548.20911"
y="230.61029"
style="font-size:30px;line-height:1">état 3</tspan></text>
</g>
<path
style="fill:none;stroke:#000000;stroke-width:3.77362204;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5196)"
d="m 137.77731,218.82563 c 50.86436,0 50.86436,0 50.86436,0"
id="path3931"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
id="path5258"
d="m 323.40231,218.82563 c 50.86436,0 50.86436,0 50.86436,0"
style="fill:none;stroke:#000000;stroke-width:3.77362204;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5262)" />
<path
style="fill:none;stroke:#000000;stroke-width:3.77362204;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5388)"
d="m 509.02731,218.82563 c 50.86436,0 50.86436,0 50.86436,0"
id="path5384"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
id="path5546"
d="m 261.46264,255.77267 c 0.55356,50.86135 0.55356,50.86135 0.55356,50.86135"
style="fill:none;stroke:#000000;stroke-width:3.77362204;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5550)" />
<rect
y="319.76712"
x="182.80771"
height="60.617012"
width="156.41521"
id="rect6260"
style="opacity:1;fill:#9bc762;fill-opacity:1;stroke:#000000;stroke-width:0.80508971;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="188.79851"
y="361.86029"
id="text6264"><tspan
sodipodi:role="line"
id="tspan6262"
x="188.79851"
y="361.86029"
style="font-size:30px;line-height:1">nombre 1</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:3.77362204;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker6319)"
d="m 447.08764,255.77267 c 0.55356,50.86135 0.55356,50.86135 0.55356,50.86135"
id="path6305"
inkscape:connector-curvature="0" />
<rect
style="opacity:1;fill:#9bc762;fill-opacity:1;stroke:#000000;stroke-width:0.80508971;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect6307"
width="156.41521"
height="60.617012"
x="368.43271"
y="319.76712" />
<text
id="text6311"
y="361.86029"
x="374.42352"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:30px;line-height:1"
y="361.86029"
x="374.42352"
id="tspan6309"
sodipodi:role="line">nombre 2</tspan></text>
<path
inkscape:connector-curvature="0"
id="path6453"
d="m 632.71264,255.77267 c 0.55356,50.86135 0.55356,50.86135 0.55356,50.86135"
style="fill:none;stroke:#000000;stroke-width:3.77362204;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker6467)" />
<rect
y="319.76712"
x="554.05774"
height="60.617012"
width="156.41521"
id="rect6455"
style="opacity:1;fill:#9bc762;fill-opacity:1;stroke:#000000;stroke-width:0.80508971;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="560.04852"
y="361.86029"
id="text6459"><tspan
sodipodi:role="line"
id="tspan6457"
x="560.04852"
y="361.86029"
style="font-size:30px;line-height:1">nombre 3</tspan></text>
</g>
</g>
</svg>
<?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">
<!-- Created with matplotlib (http://matplotlib.org/) -->
<svg height="216pt" version="1.1" viewBox="0 0 432 216" width="432pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<style type="text/css">
*{stroke-linecap:butt;stroke-linejoin:round;}
</style>
</defs>
<g id="figure_1">
<g id="patch_1">
<path d="M 0 216
L 432 216
L 432 0
L 0 0
z
" style="fill:#ffffff;"/>
</g>
<g id="axes_1">
<g id="patch_2">
<path d="M 32.55 188.2
L 417.7 188.2
L 417.7 21.8
L 32.55 21.8
z
" style="fill:#ffffff;"/>
</g>
<g id="matplotlib.axis_1">
<g id="xtick_1">
<g id="line2d_1">
<defs>
<path d="M 0 0
L 0 3.5
" id="mc140c428b7" style="stroke:#000000;stroke-width:0.8;"/>
</defs>
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="50.056818" xlink:href="#mc140c428b7" y="188.2"/>
</g>
</g>
<g id="text_1">
<!-- 0.80 -->
<defs>
<path d="M 31.78125 66.40625
Q 24.171875 66.40625 20.328125 58.90625
Q 16.5 51.421875 16.5 36.375
Q 16.5 21.390625 20.328125 13.890625
Q 24.171875 6.390625 31.78125 6.390625
Q 39.453125 6.390625 43.28125 13.890625
Q 47.125 21.390625 47.125 36.375
Q 47.125 51.421875 43.28125 58.90625
Q 39.453125 66.40625 31.78125 66.40625
M 31.78125 74.21875
Q 44.046875 74.21875 50.515625 64.515625
Q 56.984375 54.828125 56.984375 36.375
Q 56.984375 17.96875 50.515625 8.265625
Q 44.046875 -1.421875 31.78125 -1.421875
Q 19.53125 -1.421875 13.0625 8.265625
Q 6.59375 17.96875 6.59375 36.375
Q 6.59375 54.828125 13.0625 64.515625
Q 19.53125 74.21875 31.78125 74.21875
" id="DejaVuSans-30"/>
<path d="M 10.6875 12.40625
L 21 12.40625
L 21 0
L 10.6875 0
z
" id="DejaVuSans-2e"/>
<path d="M 31.78125 34.625
Q 24.75 34.625 20.71875 30.859375
Q 16.703125 27.09375 16.703125 20.515625
Q 16.703125 13.921875 20.71875 10.15625
Q 24.75 6.390625 31.78125 6.390625
Q 38.8125 6.390625 42.859375 10.171875
Q 46.921875 13.96875 46.921875 20.515625
Q 46.921875 27.09375 42.890625 30.859375
Q 38.875 34.625 31.78125 34.625
M 21.921875 38.8125
Q 15.578125 40.375 12.03125 44.71875
Q 8.5 49.078125 8.5 55.328125
Q 8.5 64.0625 14.71875 69.140625
Q 20.953125 74.21875 31.78125 74.21875
Q 42.671875 74.21875 48.875 69.140625
Q 55.078125 64.0625 55.078125 55.328125
Q 55.078125 49.078125 51.53125 44.71875
Q 48 40.375 41.703125 38.8125
Q 48.828125 37.15625 52.796875 32.3125
Q 56.78125 27.484375 56.78125 20.515625
Q 56.78125 9.90625 50.3125 4.234375
Q 43.84375 -1.421875 31.78125 -1.421875
Q 19.734375 -1.421875 13.25 4.234375
Q 6.78125 9.90625 6.78125 20.515625
Q 6.78125 27.484375 10.78125 32.3125
Q 14.796875 37.15625 21.921875 38.8125
M 18.3125 54.390625
Q 18.3125 48.734375 21.84375 45.5625
Q 25.390625 42.390625 31.78125 42.390625
Q 38.140625 42.390625 41.71875 45.5625
Q 45.3125 48.734375 45.3125 54.390625
Q 45.3125 60.0625 41.71875 63.234375
Q 38.140625 66.40625 31.78125 66.40625
Q 25.390625 66.40625 21.84375 63.234375
Q 18.3125 60.0625 18.3125 54.390625
" id="DejaVuSans-38"/>
</defs>
<g transform="translate(38.924006 202.798438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-38"/>
<use x="159.033203" xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
<g id="xtick_2">
<g id="line2d_2">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="93.823864" xlink:href="#mc140c428b7" y="188.2"/>
</g>
</g>
<g id="text_2">
<!-- 0.85 -->
<defs>
<path d="M 10.796875 72.90625
L 49.515625 72.90625
L 49.515625 64.59375
L 19.828125 64.59375
L 19.828125 46.734375
Q 21.96875 47.46875 24.109375 47.828125
Q 26.265625 48.1875 28.421875 48.1875
Q 40.625 48.1875 47.75 41.5
Q 54.890625 34.8125 54.890625 23.390625
Q 54.890625 11.625 47.5625 5.09375
Q 40.234375 -1.421875 26.90625 -1.421875
Q 22.3125 -1.421875 17.546875 -0.640625
Q 12.796875 0.140625 7.71875 1.703125
L 7.71875 11.625
Q 12.109375 9.234375 16.796875 8.0625
Q 21.484375 6.890625 26.703125 6.890625
Q 35.15625 6.890625 40.078125 11.328125
Q 45.015625 15.765625 45.015625 23.390625
Q 45.015625 31 40.078125 35.4375
Q 35.15625 39.890625 26.703125 39.890625
Q 22.75 39.890625 18.8125 39.015625
Q 14.890625 38.140625 10.796875 36.28125
z
" id="DejaVuSans-35"/>
</defs>
<g transform="translate(82.691051 202.798438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-38"/>
<use x="159.033203" xlink:href="#DejaVuSans-35"/>
</g>
</g>
</g>
<g id="xtick_3">
<g id="line2d_3">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="137.590909" xlink:href="#mc140c428b7" y="188.2"/>
</g>
</g>
<g id="text_3">
<!-- 0.90 -->
<defs>
<path d="M 10.984375 1.515625
L 10.984375 10.5
Q 14.703125 8.734375 18.5 7.8125
Q 22.3125 6.890625 25.984375 6.890625
Q 35.75 6.890625 40.890625 13.453125
Q 46.046875 20.015625 46.78125 33.40625
Q 43.953125 29.203125 39.59375 26.953125
Q 35.25 24.703125 29.984375 24.703125
Q 19.046875 24.703125 12.671875 31.3125
Q 6.296875 37.9375 6.296875 49.421875
Q 6.296875 60.640625 12.9375 67.421875
Q 19.578125 74.21875 30.609375 74.21875
Q 43.265625 74.21875 49.921875 64.515625
Q 56.59375 54.828125 56.59375 36.375
Q 56.59375 19.140625 48.40625 8.859375
Q 40.234375 -1.421875 26.421875 -1.421875
Q 22.703125 -1.421875 18.890625 -0.6875
Q 15.09375 0.046875 10.984375 1.515625
M 30.609375 32.421875
Q 37.25 32.421875 41.125 36.953125
Q 45.015625 41.5 45.015625 49.421875
Q 45.015625 57.28125 41.125 61.84375
Q 37.25 66.40625 30.609375 66.40625
Q 23.96875 66.40625 20.09375 61.84375
Q 16.21875 57.28125 16.21875 49.421875
Q 16.21875 41.5 20.09375 36.953125
Q 23.96875 32.421875 30.609375 32.421875
" id="DejaVuSans-39"/>
</defs>
<g transform="translate(126.458097 202.798438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-39"/>
<use x="159.033203" xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
<g id="xtick_4">
<g id="line2d_4">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="181.357955" xlink:href="#mc140c428b7" y="188.2"/>
</g>
</g>
<g id="text_4">
<!-- 0.95 -->
<g transform="translate(170.225142 202.798438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-39"/>
<use x="159.033203" xlink:href="#DejaVuSans-35"/>
</g>
</g>
</g>
<g id="xtick_5">
<g id="line2d_5">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="225.125" xlink:href="#mc140c428b7" y="188.2"/>
</g>
</g>
<g id="text_5">
<!-- 1.00 -->
<defs>
<path d="M 12.40625 8.296875
L 28.515625 8.296875
L 28.515625 63.921875
L 10.984375 60.40625
L 10.984375 69.390625
L 28.421875 72.90625
L 38.28125 72.90625
L 38.28125 8.296875
L 54.390625 8.296875
L 54.390625 0
L 12.40625 0
z
" id="DejaVuSans-31"/>
</defs>
<g transform="translate(213.992188 202.798438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-31"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-30"/>
<use x="159.033203" xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
<g id="xtick_6">
<g id="line2d_6">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="268.892045" xlink:href="#mc140c428b7" y="188.2"/>
</g>
</g>
<g id="text_6">
<!-- 1.05 -->
<g transform="translate(257.759233 202.798438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-31"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-30"/>
<use x="159.033203" xlink:href="#DejaVuSans-35"/>
</g>
</g>
</g>
<g id="xtick_7">
<g id="line2d_7">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="312.659091" xlink:href="#mc140c428b7" y="188.2"/>
</g>
</g>
<g id="text_7">
<!-- 1.10 -->
<g transform="translate(301.526278 202.798438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-31"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-31"/>
<use x="159.033203" xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
<g id="xtick_8">
<g id="line2d_8">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="356.426136" xlink:href="#mc140c428b7" y="188.2"/>
</g>
</g>
<g id="text_8">
<!-- 1.15 -->
<g transform="translate(345.293324 202.798438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-31"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-31"/>
<use x="159.033203" xlink:href="#DejaVuSans-35"/>
</g>
</g>
</g>
<g id="xtick_9">
<g id="line2d_9">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="400.193182" xlink:href="#mc140c428b7" y="188.2"/>
</g>
</g>
<g id="text_9">
<!-- 1.20 -->
<defs>
<path d="M 19.1875 8.296875
L 53.609375 8.296875
L 53.609375 0
L 7.328125 0
L 7.328125 8.296875
Q 12.9375 14.109375 22.625 23.890625
Q 32.328125 33.6875 34.8125 36.53125
Q 39.546875 41.84375 41.421875 45.53125
Q 43.3125 49.21875 43.3125 52.78125
Q 43.3125 58.59375 39.234375 62.25
Q 35.15625 65.921875 28.609375 65.921875
Q 23.96875 65.921875 18.8125 64.3125
Q 13.671875 62.703125 7.8125 59.421875
L 7.8125 69.390625
Q 13.765625 71.78125 18.9375 73
Q 24.125 74.21875 28.421875 74.21875
Q 39.75 74.21875 46.484375 68.546875
Q 53.21875 62.890625 53.21875 53.421875
Q 53.21875 48.921875 51.53125 44.890625
Q 49.859375 40.875 45.40625 35.40625
Q 44.1875 33.984375 37.640625 27.21875
Q 31.109375 20.453125 19.1875 8.296875
" id="DejaVuSans-32"/>
</defs>
<g transform="translate(389.060369 202.798438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-31"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-32"/>
<use x="159.033203" xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
</g>
<g id="matplotlib.axis_2">
<g id="ytick_1">
<g id="line2d_10">
<defs>
<path d="M 0 0
L -3.5 0
" id="m60e0085308" style="stroke:#000000;stroke-width:0.8;"/>
</defs>
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="32.55" xlink:href="#m60e0085308" y="164.090909"/>
</g>
</g>
<g id="text_10">
<!-- −4 -->
<defs>
<path d="M 10.59375 35.5
L 73.1875 35.5
L 73.1875 27.203125
L 10.59375 27.203125
z
" id="DejaVuSans-2212"/>
<path d="M 37.796875 64.3125
L 12.890625 25.390625
L 37.796875 25.390625
z
M 35.203125 72.90625
L 47.609375 72.90625
L 47.609375 25.390625
L 58.015625 25.390625
L 58.015625 17.1875
L 47.609375 17.1875
L 47.609375 0
L 37.796875 0
L 37.796875 17.1875
L 4.890625 17.1875
L 4.890625 26.703125
z
" id="DejaVuSans-34"/>
</defs>
<g transform="translate(10.807813 167.890128)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-2212"/>
<use x="83.789062" xlink:href="#DejaVuSans-34"/>
</g>
</g>
</g>
<g id="ytick_2">
<g id="line2d_11">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="32.55" xlink:href="#m60e0085308" y="134.545455"/>
</g>
</g>
<g id="text_11">
<!-- −2 -->
<g transform="translate(10.807813 138.344673)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-2212"/>
<use x="83.789062" xlink:href="#DejaVuSans-32"/>
</g>
</g>
</g>
<g id="ytick_3">
<g id="line2d_12">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="32.55" xlink:href="#m60e0085308" y="105"/>
</g>
</g>
<g id="text_12">
<!-- 0 -->
<g transform="translate(19.1875 108.799219)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
<g id="ytick_4">
<g id="line2d_13">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="32.55" xlink:href="#m60e0085308" y="75.454546"/>
</g>
</g>
<g id="text_13">
<!-- 2 -->
<g transform="translate(19.1875 79.253765)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-32"/>
</g>
</g>
</g>
<g id="ytick_5">
<g id="line2d_14">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="32.55" xlink:href="#m60e0085308" y="45.909092"/>
</g>
</g>
<g id="text_14">
<!-- 4 -->
<g transform="translate(19.1875 49.708311)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-34"/>
</g>
</g>
</g>
<g id="text_15">
<!-- 1e−7 -->
<defs>
<path d="M 56.203125 29.59375
L 56.203125 25.203125
L 14.890625 25.203125
Q 15.484375 15.921875 20.484375 11.0625
Q 25.484375 6.203125 34.421875 6.203125
Q 39.59375 6.203125 44.453125 7.46875
Q 49.3125 8.734375 54.109375 11.28125
L 54.109375 2.78125
Q 49.265625 0.734375 44.1875 -0.34375
Q 39.109375 -1.421875 33.890625 -1.421875
Q 20.796875 -1.421875 13.15625 6.1875
Q 5.515625 13.8125 5.515625 26.8125
Q 5.515625 40.234375 12.765625 48.109375
Q 20.015625 56 32.328125 56
Q 43.359375 56 49.78125 48.890625
Q 56.203125 41.796875 56.203125 29.59375
M 47.21875 32.234375
Q 47.125 39.59375 43.09375 43.984375
Q 39.0625 48.390625 32.421875 48.390625
Q 24.90625 48.390625 20.390625 44.140625
Q 15.875 39.890625 15.1875 32.171875
z
" id="DejaVuSans-65"/>
<path d="M 8.203125 72.90625
L 55.078125 72.90625
L 55.078125 68.703125
L 28.609375 0
L 18.3125 0
L 43.21875 64.59375
L 8.203125 64.59375
z
" id="DejaVuSans-37"/>
</defs>
<g transform="translate(32.55 18.8)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-31"/>
<use x="63.623047" xlink:href="#DejaVuSans-65"/>
<use x="125.146484" xlink:href="#DejaVuSans-2212"/>
<use x="208.935547" xlink:href="#DejaVuSans-37"/>
</g>
</g>
</g>
<g id="line2d_15">
<path clip-path="url(#pda169e14cf)" d="M 50.056818 180.636364
L 53.593549 167.944747
L 57.13028 157.182673
L 60.667011 148.088405
L 64.203742 140.431246
L 67.740473 134.008412
L 71.277204 128.64216
L 74.813935 124.177157
L 78.350666 120.478066
L 81.887397 117.427365
L 85.424128 114.923337
L 88.960859 112.878261
L 92.49759 111.216779
L 96.03432 109.874382
L 99.571051 108.796114
L 103.107782 107.935323
L 106.644513 107.252615
L 110.181244 106.714883
L 113.717975 106.294432
L 117.254706 105.968237
L 120.791437 105.717268
L 124.328168 105.525881
L 127.864899 105.381309
L 131.40163 105.273212
L 134.938361 105.193263
L 138.475092 105.134829
L 142.011823 105.09266
L 145.548554 105.062652
L 149.085285 105.041612
L 152.622016 105.027107
L 156.158747 105.017282
L 159.695478 105.010761
L 163.232208 105.006529
L 166.768939 105.003846
L 170.30567 105.002191
L 173.842401 105.001201
L 177.379132 105.000632
L 180.915863 105.000314
L 184.452594 105.000151
L 187.989325 105.000064
L 191.526056 105.000028
L 195.062787 105.000008
L 198.599518 105.000006
L 202.136249 105.000002
L 205.67298 105.000002
L 209.209711 104.999998
L 212.746442 105.000002
L 216.283173 104.999999
L 219.819904 105.000004
L 223.356635 105.000002
L 226.893365 105.000004
L 230.430096 104.999999
L 233.966827 104.999997
L 237.503558 104.999998
L 241.040289 105.000006
L 244.57702 105.000006
L 248.113751 105.000002
L 251.650482 104.999999
L 255.187213 104.99999
L 258.723944 104.999976
L 262.260675 104.999934
L 265.797406 104.999852
L 269.334137 104.999689
L 272.870868 104.99937
L 276.407599 104.998801
L 279.94433 104.997812
L 283.481061 104.996159
L 287.017792 104.993478
L 290.554522 104.989241
L 294.091253 104.98272
L 297.627984 104.972894
L 301.164715 104.958388
L 304.701446 104.937353
L 308.238177 104.907339
L 311.774908 104.865177
L 315.311639 104.806739
L 318.84837 104.726794
L 322.385101 104.618683
L 325.921832 104.474124
L 329.458563 104.28273
L 332.995294 104.03176
L 336.532025 103.70557
L 340.068756 103.285113
L 343.605487 102.747385
L 347.142218 102.064678
L 350.678949 101.203889
L 354.21568 100.125623
L 357.75241 98.783222
L 361.289141 97.121739
L 364.825872 95.076667
L 368.362603 92.57264
L 371.899334 89.521931
L 375.436065 85.822846
L 378.972796 81.357839
L 382.509527 75.991593
L 386.046258 69.568751
L 389.582989 61.911599
L 393.11972 52.817309
L 396.656451 42.055256
L 400.193182 29.363636
" style="fill:none;stroke:#1f77b4;stroke-linecap:square;stroke-width:1.5;"/>
</g>
<g id="patch_3">
<path d="M 32.55 188.2
L 32.55 21.8
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_4">
<path d="M 417.7 188.2
L 417.7 21.8
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_5">
<path d="M 32.55 188.2
L 417.7 188.2
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_6">
<path d="M 32.55 21.8
L 417.7 21.8
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="legend_1">
<g id="patch_7">
<path d="M 39.55 183.2
L 121.064063 183.2
Q 123.064063 183.2 123.064063 181.2
L 123.064063 167.121875
Q 123.064063 165.121875 121.064063 165.121875
L 39.55 165.121875
Q 37.55 165.121875 37.55 167.121875
L 37.55 181.2
Q 37.55 183.2 39.55 183.2
z
" style="fill:#ffffff;opacity:0.8;stroke:#cccccc;stroke-linejoin:miter;"/>
</g>
<g id="line2d_16">
<path d="M 41.55 173.620313
L 61.55 173.620313
" style="fill:none;stroke:#1f77b4;stroke-linecap:square;stroke-width:1.5;"/>
</g>
<g id="line2d_17"/>
<g id="text_16">
<!-- polynôme -->
<defs>
<path d="M 18.109375 8.203125
L 18.109375 -20.796875
L 9.078125 -20.796875
L 9.078125 54.6875
L 18.109375 54.6875
L 18.109375 46.390625
Q 20.953125 51.265625 25.265625 53.625
Q 29.59375 56 35.59375 56
Q 45.5625 56 51.78125 48.09375
Q 58.015625 40.1875 58.015625 27.296875
Q 58.015625 14.40625 51.78125 6.484375
Q 45.5625 -1.421875 35.59375 -1.421875
Q 29.59375 -1.421875 25.265625 0.953125
Q 20.953125 3.328125 18.109375 8.203125
M 48.6875 27.296875
Q 48.6875 37.203125 44.609375 42.84375
Q 40.53125 48.484375 33.40625 48.484375
Q 26.265625 48.484375 22.1875 42.84375
Q 18.109375 37.203125 18.109375 27.296875
Q 18.109375 17.390625 22.1875 11.75
Q 26.265625 6.109375 33.40625 6.109375
Q 40.53125 6.109375 44.609375 11.75
Q 48.6875 17.390625 48.6875 27.296875
" id="DejaVuSans-70"/>
<path d="M 30.609375 48.390625
Q 23.390625 48.390625 19.1875 42.75
Q 14.984375 37.109375 14.984375 27.296875
Q 14.984375 17.484375 19.15625 11.84375
Q 23.34375 6.203125 30.609375 6.203125
Q 37.796875 6.203125 41.984375 11.859375
Q 46.1875 17.53125 46.1875 27.296875
Q 46.1875 37.015625 41.984375 42.703125
Q 37.796875 48.390625 30.609375 48.390625
M 30.609375 56
Q 42.328125 56 49.015625 48.375
Q 55.71875 40.765625 55.71875 27.296875
Q 55.71875 13.875 49.015625 6.21875
Q 42.328125 -1.421875 30.609375 -1.421875
Q 18.84375 -1.421875 12.171875 6.21875
Q 5.515625 13.875 5.515625 27.296875
Q 5.515625 40.765625 12.171875 48.375
Q 18.84375 56 30.609375 56
" id="DejaVuSans-6f"/>
<path d="M 9.421875 75.984375
L 18.40625 75.984375
L 18.40625 0
L 9.421875 0
z
" id="DejaVuSans-6c"/>
<path d="M 32.171875 -5.078125
Q 28.375 -14.84375 24.75 -17.8125
Q 21.140625 -20.796875 15.09375 -20.796875
L 7.90625 -20.796875
L 7.90625 -13.28125
L 13.1875 -13.28125
Q 16.890625 -13.28125 18.9375 -11.515625
Q 21 -9.765625 23.484375 -3.21875
L 25.09375 0.875
L 2.984375 54.6875
L 12.5 54.6875
L 29.59375 11.921875
L 46.6875 54.6875
L 56.203125 54.6875
z
" id="DejaVuSans-79"/>
<path d="M 54.890625 33.015625
L 54.890625 0
L 45.90625 0
L 45.90625 32.71875
Q 45.90625 40.484375 42.875 44.328125
Q 39.84375 48.1875 33.796875 48.1875
Q 26.515625 48.1875 22.3125 43.546875
Q 18.109375 38.921875 18.109375 30.90625
L 18.109375 0
L 9.078125 0
L 9.078125 54.6875
L 18.109375 54.6875
L 18.109375 46.1875
Q 21.34375 51.125 25.703125 53.5625
Q 30.078125 56 35.796875 56
Q 45.21875 56 50.046875 50.171875
Q 54.890625 44.34375 54.890625 33.015625
" id="DejaVuSans-6e"/>
<path d="M 30.609375 48.390625
Q 23.390625 48.390625 19.1875 42.75
Q 14.984375 37.109375 14.984375 27.296875
Q 14.984375 17.484375 19.15625 11.84375
Q 23.34375 6.203125 30.609375 6.203125
Q 37.796875 6.203125 41.984375 11.859375
Q 46.1875 17.53125 46.1875 27.296875
Q 46.1875 37.015625 41.984375 42.703125
Q 37.796875 48.390625 30.609375 48.390625
M 30.609375 56
Q 42.328125 56 49.015625 48.375
Q 55.71875 40.765625 55.71875 27.296875
Q 55.71875 13.875 49.015625 6.21875
Q 42.328125 -1.421875 30.609375 -1.421875
Q 18.84375 -1.421875 12.171875 6.21875
Q 5.515625 13.875 5.515625 27.296875
Q 5.515625 40.765625 12.171875 48.375
Q 18.84375 56 30.609375 56
M 27.015625 79.984375
L 34.234375 79.984375
L 46.203125 61.625
L 39.421875 61.625
L 30.625 73.578125
L 21.84375 61.625
L 15.046875 61.625
z
" id="DejaVuSans-f4"/>
<path d="M 52 44.1875
Q 55.375 50.25 60.0625 53.125
Q 64.75 56 71.09375 56
Q 79.640625 56 84.28125 50.015625
Q 88.921875 44.046875 88.921875 33.015625
L 88.921875 0
L 79.890625 0
L 79.890625 32.71875
Q 79.890625 40.578125 77.09375 44.375
Q 74.3125 48.1875 68.609375 48.1875
Q 61.625 48.1875 57.5625 43.546875
Q 53.515625 38.921875 53.515625 30.90625
L 53.515625 0
L 44.484375 0
L 44.484375 32.71875
Q 44.484375 40.625 41.703125 44.40625
Q 38.921875 48.1875 33.109375 48.1875
Q 26.21875 48.1875 22.15625 43.53125
Q 18.109375 38.875 18.109375 30.90625
L 18.109375 0
L 9.078125 0
L 9.078125 54.6875
L 18.109375 54.6875
L 18.109375 46.1875
Q 21.1875 51.21875 25.484375 53.609375
Q 29.78125 56 35.6875 56
Q 41.65625 56 45.828125 52.96875
Q 50 49.953125 52 44.1875
" id="DejaVuSans-6d"/>
</defs>
<g transform="translate(69.55 177.120313)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-70"/>
<use x="63.476562" xlink:href="#DejaVuSans-6f"/>
<use x="124.658203" xlink:href="#DejaVuSans-6c"/>
<use x="152.441406" xlink:href="#DejaVuSans-79"/>
<use x="211.621094" xlink:href="#DejaVuSans-6e"/>
<use x="275" xlink:href="#DejaVuSans-f4"/>
<use x="336.181641" xlink:href="#DejaVuSans-6d"/>
<use x="433.59375" xlink:href="#DejaVuSans-65"/>
</g>
</g>
</g>
</g>
</g>
<defs>
<clipPath id="pda169e14cf">
<rect height="166.4" width="385.15" x="32.55" y="21.8"/>
</clipPath>
</defs>
</svg>
<?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">
<!-- Created with matplotlib (http://matplotlib.org/) -->
<svg height="216pt" version="1.1" viewBox="0 0 432 216" width="432pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<style type="text/css">
*{stroke-linecap:butt;stroke-linejoin:round;}
</style>
</defs>
<g id="figure_1">
<g id="patch_1">
<path d="M 0 216
L 432 216
L 432 0
L 0 0
z
" style="fill:#ffffff;"/>
</g>
<g id="axes_1">
<g id="patch_2">
<path d="M 32.55 188.2
L 417.7 188.2
L 417.7 21.8
L 32.55 21.8
z
" style="fill:#ffffff;"/>
</g>
<g id="matplotlib.axis_1">
<g id="xtick_1">
<g id="line2d_1">
<defs>
<path d="M 0 0
L 0 3.5
" id="m7575adc221" style="stroke:#000000;stroke-width:0.8;"/>
</defs>
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="50.056818" xlink:href="#m7575adc221" y="188.2"/>
</g>
</g>
<g id="text_1">
<!-- 0.80 -->
<defs>
<path d="M 31.78125 66.40625
Q 24.171875 66.40625 20.328125 58.90625
Q 16.5 51.421875 16.5 36.375
Q 16.5 21.390625 20.328125 13.890625
Q 24.171875 6.390625 31.78125 6.390625
Q 39.453125 6.390625 43.28125 13.890625
Q 47.125 21.390625 47.125 36.375
Q 47.125 51.421875 43.28125 58.90625
Q 39.453125 66.40625 31.78125 66.40625
M 31.78125 74.21875
Q 44.046875 74.21875 50.515625 64.515625
Q 56.984375 54.828125 56.984375 36.375
Q 56.984375 17.96875 50.515625 8.265625
Q 44.046875 -1.421875 31.78125 -1.421875
Q 19.53125 -1.421875 13.0625 8.265625
Q 6.59375 17.96875 6.59375 36.375
Q 6.59375 54.828125 13.0625 64.515625
Q 19.53125 74.21875 31.78125 74.21875
" id="DejaVuSans-30"/>
<path d="M 10.6875 12.40625
L 21 12.40625
L 21 0
L 10.6875 0
z
" id="DejaVuSans-2e"/>
<path d="M 31.78125 34.625
Q 24.75 34.625 20.71875 30.859375
Q 16.703125 27.09375 16.703125 20.515625
Q 16.703125 13.921875 20.71875 10.15625
Q 24.75 6.390625 31.78125 6.390625
Q 38.8125 6.390625 42.859375 10.171875
Q 46.921875 13.96875 46.921875 20.515625
Q 46.921875 27.09375 42.890625 30.859375
Q 38.875 34.625 31.78125 34.625
M 21.921875 38.8125
Q 15.578125 40.375 12.03125 44.71875
Q 8.5 49.078125 8.5 55.328125
Q 8.5 64.0625 14.71875 69.140625
Q 20.953125 74.21875 31.78125 74.21875
Q 42.671875 74.21875 48.875 69.140625
Q 55.078125 64.0625 55.078125 55.328125
Q 55.078125 49.078125 51.53125 44.71875
Q 48 40.375 41.703125 38.8125
Q 48.828125 37.15625 52.796875 32.3125
Q 56.78125 27.484375 56.78125 20.515625
Q 56.78125 9.90625 50.3125 4.234375
Q 43.84375 -1.421875 31.78125 -1.421875
Q 19.734375 -1.421875 13.25 4.234375
Q 6.78125 9.90625 6.78125 20.515625
Q 6.78125 27.484375 10.78125 32.3125
Q 14.796875 37.15625 21.921875 38.8125
M 18.3125 54.390625
Q 18.3125 48.734375 21.84375 45.5625
Q 25.390625 42.390625 31.78125 42.390625
Q 38.140625 42.390625 41.71875 45.5625
Q 45.3125 48.734375 45.3125 54.390625
Q 45.3125 60.0625 41.71875 63.234375
Q 38.140625 66.40625 31.78125 66.40625
Q 25.390625 66.40625 21.84375 63.234375
Q 18.3125 60.0625 18.3125 54.390625
" id="DejaVuSans-38"/>
</defs>
<g transform="translate(38.924006 202.798438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-38"/>
<use x="159.033203" xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
<g id="xtick_2">
<g id="line2d_2">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="93.823864" xlink:href="#m7575adc221" y="188.2"/>
</g>
</g>
<g id="text_2">
<!-- 0.85 -->
<defs>
<path d="M 10.796875 72.90625
L 49.515625 72.90625
L 49.515625 64.59375
L 19.828125 64.59375
L 19.828125 46.734375
Q 21.96875 47.46875 24.109375 47.828125
Q 26.265625 48.1875 28.421875 48.1875
Q 40.625 48.1875 47.75 41.5
Q 54.890625 34.8125 54.890625 23.390625
Q 54.890625 11.625 47.5625 5.09375
Q 40.234375 -1.421875 26.90625 -1.421875
Q 22.3125 -1.421875 17.546875 -0.640625
Q 12.796875 0.140625 7.71875 1.703125
L 7.71875 11.625
Q 12.109375 9.234375 16.796875 8.0625
Q 21.484375 6.890625 26.703125 6.890625
Q 35.15625 6.890625 40.078125 11.328125
Q 45.015625 15.765625 45.015625 23.390625
Q 45.015625 31 40.078125 35.4375
Q 35.15625 39.890625 26.703125 39.890625
Q 22.75 39.890625 18.8125 39.015625
Q 14.890625 38.140625 10.796875 36.28125
z
" id="DejaVuSans-35"/>
</defs>
<g transform="translate(82.691051 202.798438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-38"/>
<use x="159.033203" xlink:href="#DejaVuSans-35"/>
</g>
</g>
</g>
<g id="xtick_3">
<g id="line2d_3">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="137.590909" xlink:href="#m7575adc221" y="188.2"/>
</g>
</g>
<g id="text_3">
<!-- 0.90 -->
<defs>
<path d="M 10.984375 1.515625
L 10.984375 10.5
Q 14.703125 8.734375 18.5 7.8125
Q 22.3125 6.890625 25.984375 6.890625
Q 35.75 6.890625 40.890625 13.453125
Q 46.046875 20.015625 46.78125 33.40625
Q 43.953125 29.203125 39.59375 26.953125
Q 35.25 24.703125 29.984375 24.703125
Q 19.046875 24.703125 12.671875 31.3125
Q 6.296875 37.9375 6.296875 49.421875
Q 6.296875 60.640625 12.9375 67.421875
Q 19.578125 74.21875 30.609375 74.21875
Q 43.265625 74.21875 49.921875 64.515625
Q 56.59375 54.828125 56.59375 36.375
Q 56.59375 19.140625 48.40625 8.859375
Q 40.234375 -1.421875 26.421875 -1.421875
Q 22.703125 -1.421875 18.890625 -0.6875
Q 15.09375 0.046875 10.984375 1.515625
M 30.609375 32.421875
Q 37.25 32.421875 41.125 36.953125
Q 45.015625 41.5 45.015625 49.421875
Q 45.015625 57.28125 41.125 61.84375
Q 37.25 66.40625 30.609375 66.40625
Q 23.96875 66.40625 20.09375 61.84375
Q 16.21875 57.28125 16.21875 49.421875
Q 16.21875 41.5 20.09375 36.953125
Q 23.96875 32.421875 30.609375 32.421875
" id="DejaVuSans-39"/>
</defs>
<g transform="translate(126.458097 202.798438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-39"/>
<use x="159.033203" xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
<g id="xtick_4">
<g id="line2d_4">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="181.357955" xlink:href="#m7575adc221" y="188.2"/>
</g>
</g>
<g id="text_4">
<!-- 0.95 -->
<g transform="translate(170.225142 202.798438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-39"/>
<use x="159.033203" xlink:href="#DejaVuSans-35"/>
</g>
</g>
</g>
<g id="xtick_5">
<g id="line2d_5">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="225.125" xlink:href="#m7575adc221" y="188.2"/>
</g>
</g>
<g id="text_5">
<!-- 1.00 -->
<defs>
<path d="M 12.40625 8.296875
L 28.515625 8.296875
L 28.515625 63.921875
L 10.984375 60.40625
L 10.984375 69.390625
L 28.421875 72.90625
L 38.28125 72.90625
L 38.28125 8.296875
L 54.390625 8.296875
L 54.390625 0
L 12.40625 0
z
" id="DejaVuSans-31"/>
</defs>
<g transform="translate(213.992188 202.798438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-31"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-30"/>
<use x="159.033203" xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
<g id="xtick_6">
<g id="line2d_6">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="268.892045" xlink:href="#m7575adc221" y="188.2"/>
</g>
</g>
<g id="text_6">
<!-- 1.05 -->
<g transform="translate(257.759233 202.798438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-31"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-30"/>
<use x="159.033203" xlink:href="#DejaVuSans-35"/>
</g>
</g>
</g>
<g id="xtick_7">
<g id="line2d_7">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="312.659091" xlink:href="#m7575adc221" y="188.2"/>
</g>
</g>
<g id="text_7">
<!-- 1.10 -->
<g transform="translate(301.526278 202.798438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-31"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-31"/>
<use x="159.033203" xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
<g id="xtick_8">
<g id="line2d_8">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="356.426136" xlink:href="#m7575adc221" y="188.2"/>
</g>
</g>
<g id="text_8">
<!-- 1.15 -->
<g transform="translate(345.293324 202.798438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-31"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-31"/>
<use x="159.033203" xlink:href="#DejaVuSans-35"/>
</g>
</g>
</g>
<g id="xtick_9">
<g id="line2d_9">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="400.193182" xlink:href="#m7575adc221" y="188.2"/>
</g>
</g>
<g id="text_9">
<!-- 1.20 -->
<defs>
<path d="M 19.1875 8.296875
L 53.609375 8.296875
L 53.609375 0
L 7.328125 0
L 7.328125 8.296875
Q 12.9375 14.109375 22.625 23.890625
Q 32.328125 33.6875 34.8125 36.53125
Q 39.546875 41.84375 41.421875 45.53125
Q 43.3125 49.21875 43.3125 52.78125
Q 43.3125 58.59375 39.234375 62.25
Q 35.15625 65.921875 28.609375 65.921875
Q 23.96875 65.921875 18.8125 64.3125
Q 13.671875 62.703125 7.8125 59.421875
L 7.8125 69.390625
Q 13.765625 71.78125 18.9375 73
Q 24.125 74.21875 28.421875 74.21875
Q 39.75 74.21875 46.484375 68.546875
Q 53.21875 62.890625 53.21875 53.421875
Q 53.21875 48.921875 51.53125 44.890625
Q 49.859375 40.875 45.40625 35.40625
Q 44.1875 33.984375 37.640625 27.21875
Q 31.109375 20.453125 19.1875 8.296875
" id="DejaVuSans-32"/>
</defs>
<g transform="translate(389.060369 202.798438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-31"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-32"/>
<use x="159.033203" xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
</g>
<g id="matplotlib.axis_2">
<g id="ytick_1">
<g id="line2d_10">
<defs>
<path d="M 0 0
L -3.5 0
" id="me428ef0cc2" style="stroke:#000000;stroke-width:0.8;"/>
</defs>
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="32.55" xlink:href="#me428ef0cc2" y="164.090909"/>
</g>
</g>
<g id="text_10">
<!-- −4 -->
<defs>
<path d="M 10.59375 35.5
L 73.1875 35.5
L 73.1875 27.203125
L 10.59375 27.203125
z
" id="DejaVuSans-2212"/>
<path d="M 37.796875 64.3125
L 12.890625 25.390625
L 37.796875 25.390625
z
M 35.203125 72.90625
L 47.609375 72.90625
L 47.609375 25.390625
L 58.015625 25.390625
L 58.015625 17.1875
L 47.609375 17.1875
L 47.609375 0
L 37.796875 0
L 37.796875 17.1875
L 4.890625 17.1875
L 4.890625 26.703125
z
" id="DejaVuSans-34"/>
</defs>
<g transform="translate(10.807813 167.890128)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-2212"/>
<use x="83.789062" xlink:href="#DejaVuSans-34"/>
</g>
</g>
</g>
<g id="ytick_2">
<g id="line2d_11">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="32.55" xlink:href="#me428ef0cc2" y="134.545455"/>
</g>
</g>
<g id="text_11">
<!-- −2 -->
<g transform="translate(10.807813 138.344674)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-2212"/>
<use x="83.789062" xlink:href="#DejaVuSans-32"/>
</g>
</g>
</g>
<g id="ytick_3">
<g id="line2d_12">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="32.55" xlink:href="#me428ef0cc2" y="105.000001"/>
</g>
</g>
<g id="text_12">
<!-- 0 -->
<g transform="translate(19.1875 108.79922)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
<g id="ytick_4">
<g id="line2d_13">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="32.55" xlink:href="#me428ef0cc2" y="75.454547"/>
</g>
</g>
<g id="text_13">
<!-- 2 -->
<g transform="translate(19.1875 79.253766)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-32"/>
</g>
</g>
</g>
<g id="ytick_5">
<g id="line2d_14">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="32.55" xlink:href="#me428ef0cc2" y="45.909093"/>
</g>
</g>
<g id="text_14">
<!-- 4 -->
<g transform="translate(19.1875 49.708312)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-34"/>
</g>
</g>
</g>
<g id="text_15">
<!-- 1e−7 -->
<defs>
<path d="M 56.203125 29.59375
L 56.203125 25.203125
L 14.890625 25.203125
Q 15.484375 15.921875 20.484375 11.0625
Q 25.484375 6.203125 34.421875 6.203125
Q 39.59375 6.203125 44.453125 7.46875
Q 49.3125 8.734375 54.109375 11.28125
L 54.109375 2.78125
Q 49.265625 0.734375 44.1875 -0.34375
Q 39.109375 -1.421875 33.890625 -1.421875
Q 20.796875 -1.421875 13.15625 6.1875
Q 5.515625 13.8125 5.515625 26.8125
Q 5.515625 40.234375 12.765625 48.109375
Q 20.015625 56 32.328125 56
Q 43.359375 56 49.78125 48.890625
Q 56.203125 41.796875 56.203125 29.59375
M 47.21875 32.234375
Q 47.125 39.59375 43.09375 43.984375
Q 39.0625 48.390625 32.421875 48.390625
Q 24.90625 48.390625 20.390625 44.140625
Q 15.875 39.890625 15.1875 32.171875
z
" id="DejaVuSans-65"/>
<path d="M 8.203125 72.90625
L 55.078125 72.90625
L 55.078125 68.703125
L 28.609375 0
L 18.3125 0
L 43.21875 64.59375
L 8.203125 64.59375
z
" id="DejaVuSans-37"/>
</defs>
<g transform="translate(32.55 18.8)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-31"/>
<use x="63.623047" xlink:href="#DejaVuSans-65"/>
<use x="125.146484" xlink:href="#DejaVuSans-2212"/>
<use x="208.935547" xlink:href="#DejaVuSans-37"/>
</g>
</g>
</g>
<g id="line2d_15">
<path clip-path="url(#pcc37a37619)" d="M 50.056818 180.636364
L 53.593549 167.944747
L 57.13028 157.182673
L 60.667011 148.088405
L 64.203742 140.431246
L 67.740473 134.008412
L 71.277204 128.64216
L 74.813935 124.177157
L 78.350666 120.478066
L 81.887397 117.427366
L 85.424128 114.923337
L 88.960859 112.878262
L 92.49759 111.21678
L 96.03432 109.874383
L 99.571051 108.796114
L 103.107782 107.935324
L 106.644513 107.252616
L 110.181244 106.714883
L 113.717975 106.294433
L 117.254706 105.968237
L 120.791437 105.717268
L 124.328168 105.525882
L 127.864899 105.381309
L 131.40163 105.273213
L 134.938361 105.193264
L 138.475092 105.134829
L 142.011823 105.09266
L 145.548554 105.062653
L 149.085285 105.041612
L 152.622016 105.027108
L 156.158747 105.017283
L 159.695478 105.010761
L 163.232208 105.00653
L 166.768939 105.003846
L 170.30567 105.002192
L 173.842401 105.001202
L 177.379132 105.000633
L 180.915863 105.000314
L 184.452594 105.000152
L 187.989325 105.000065
L 191.526056 105.000029
L 195.062787 105.000009
L 198.599518 105.000006
L 202.136249 105.000002
L 205.67298 105.000003
L 209.209711 104.999999
L 212.746442 105.000002
L 216.283173 105
L 219.819904 105.000004
L 223.356635 105.000002
L 226.893365 105.000005
L 230.430096 105
L 233.966827 104.999997
L 237.503558 104.999998
L 241.040289 105.000006
L 244.57702 105.000007
L 248.113751 105.000003
L 251.650482 105
L 255.187213 104.999991
L 258.723944 104.999977
L 262.260675 104.999935
L 265.797406 104.999852
L 269.334137 104.99969
L 272.870868 104.99937
L 276.407599 104.998802
L 279.94433 104.997812
L 283.481061 104.996159
L 287.017792 104.993479
L 290.554522 104.989242
L 294.091253 104.982721
L 297.627984 104.972894
L 301.164715 104.958388
L 304.701446 104.937353
L 308.238177 104.907339
L 311.774908 104.865178
L 315.311639 104.80674
L 318.84837 104.726795
L 322.385101 104.618684
L 325.921832 104.474124
L 329.458563 104.28273
L 332.995294 104.03176
L 336.532025 103.705571
L 340.068756 103.285113
L 343.605487 102.747385
L 347.142218 102.064678
L 350.678949 101.20389
L 354.21568 100.125624
L 357.75241 98.783223
L 361.289141 97.121739
L 364.825872 95.076667
L 368.362603 92.57264
L 371.899334 89.521931
L 375.436065 85.822847
L 378.972796 81.35784
L 382.509527 75.991594
L 386.046258 69.568752
L 389.582989 61.911599
L 393.11972 52.81731
L 396.656451 42.055256
L 400.193182 29.363637
" style="fill:none;stroke:#1f77b4;stroke-linecap:square;stroke-width:1.5;"/>
</g>
<g id="line2d_16">
<path clip-path="url(#pcc37a37619)" d="M 50.056818 180.636363
L 53.593549 167.944748
L 57.13028 157.182676
L 60.667011 148.088406
L 64.203742 140.431246
L 67.740473 134.008413
L 71.277204 128.642162
L 74.813935 124.177157
L 78.350666 120.478067
L 81.887397 117.427365
L 85.424128 114.923337
L 88.960859 112.878262
L 92.49759 111.216777
L 96.03432 109.874384
L 99.571051 108.796113
L 103.107782 107.935322
L 106.644513 107.252617
L 110.181244 106.714883
L 113.717975 106.294432
L 117.254706 105.968239
L 120.791437 105.717269
L 124.328168 105.525882
L 127.864899 105.38131
L 131.40163 105.27321
L 134.938361 105.193262
L 138.475092 105.134829
L 142.011823 105.092661
L 145.548554 105.062651
L 149.085285 105.041615
L 152.622016 105.027106
L 156.158747 105.017283
L 159.695478 105.01076
L 163.232208 105.006527
L 166.768939 105.003844
L 170.30567 105.00219
L 173.842401 105.001202
L 177.379132 105.000633
L 180.915863 105.000317
L 184.452594 105.000149
L 187.989325 105.000067
L 191.526056 105.000029
L 195.062787 105.000012
L 198.599518 105.000005
L 202.136249 105.000002
L 205.67298 105.000001
L 209.209711 105
L 212.746442 105.000001
L 216.283173 105
L 219.819904 105
L 223.356635 105.000002
L 226.893365 105
L 230.430096 105.000001
L 233.966827 105.000001
L 237.503558 105.000002
L 241.040289 104.999999
L 244.57702 104.999999
L 248.113751 105
L 251.650482 104.999997
L 255.187213 104.999991
L 258.723944 104.999973
L 262.260675 104.999934
L 265.797406 104.999851
L 269.334137 104.999685
L 272.870868 104.999371
L 276.407599 104.998799
L 279.94433 104.997812
L 283.481061 104.996158
L 287.017792 104.993475
L 290.554522 104.989243
L 294.091253 104.982719
L 297.627984 104.972894
L 301.164715 104.958389
L 304.701446 104.937351
L 308.238177 104.90734
L 311.774908 104.865174
L 315.311639 104.806737
L 318.84837 104.726793
L 322.385101 104.618693
L 325.921832 104.474119
L 329.458563 104.28273
L 332.995294 104.03176
L 336.532025 103.705573
L 340.068756 103.285117
L 343.605487 102.747384
L 347.142218 102.064682
L 350.678949 101.203887
L 354.21568 100.125621
L 357.75241 98.783227
L 361.289141 97.121736
L 364.825872 95.076666
L 368.362603 92.572639
L 371.899334 89.521933
L 375.436065 85.822843
L 378.972796 81.357841
L 382.509527 75.991589
L 386.046258 69.568759
L 389.582989 61.911596
L 393.11972 52.817328
L 396.656451 42.055256
L 400.193182 29.363636
" style="fill:none;stroke:#ff7f0e;stroke-linecap:square;stroke-width:1.5;"/>
</g>
<g id="patch_3">
<path d="M 32.55 188.2
L 32.55 21.8
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_4">
<path d="M 417.7 188.2
L 417.7 21.8
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_5">
<path d="M 32.55 188.2
L 417.7 188.2
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_6">
<path d="M 32.55 21.8
L 417.7 21.8
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="legend_1">
<g id="patch_7">
<path d="M 39.55 183.2
L 249.990625 183.2
Q 251.990625 183.2 251.990625 181.2
L 251.990625 152.04375
Q 251.990625 150.04375 249.990625 150.04375
L 39.55 150.04375
Q 37.55 150.04375 37.55 152.04375
L 37.55 181.2
Q 37.55 183.2 39.55 183.2
z
" style="fill:#ffffff;opacity:0.8;stroke:#cccccc;stroke-linejoin:miter;"/>
</g>
<g id="line2d_17">
<path d="M 41.55 158.542188
L 61.55 158.542188
" style="fill:none;stroke:#1f77b4;stroke-linecap:square;stroke-width:1.5;"/>
</g>
<g id="line2d_18"/>
<g id="text_16">
<!-- polynôme -->
<defs>
<path d="M 18.109375 8.203125
L 18.109375 -20.796875
L 9.078125 -20.796875
L 9.078125 54.6875
L 18.109375 54.6875
L 18.109375 46.390625
Q 20.953125 51.265625 25.265625 53.625
Q 29.59375 56 35.59375 56
Q 45.5625 56 51.78125 48.09375
Q 58.015625 40.1875 58.015625 27.296875
Q 58.015625 14.40625 51.78125 6.484375
Q 45.5625 -1.421875 35.59375 -1.421875
Q 29.59375 -1.421875 25.265625 0.953125
Q 20.953125 3.328125 18.109375 8.203125
M 48.6875 27.296875
Q 48.6875 37.203125 44.609375 42.84375
Q 40.53125 48.484375 33.40625 48.484375
Q 26.265625 48.484375 22.1875 42.84375
Q 18.109375 37.203125 18.109375 27.296875
Q 18.109375 17.390625 22.1875 11.75
Q 26.265625 6.109375 33.40625 6.109375
Q 40.53125 6.109375 44.609375 11.75
Q 48.6875 17.390625 48.6875 27.296875
" id="DejaVuSans-70"/>
<path d="M 30.609375 48.390625
Q 23.390625 48.390625 19.1875 42.75
Q 14.984375 37.109375 14.984375 27.296875
Q 14.984375 17.484375 19.15625 11.84375
Q 23.34375 6.203125 30.609375 6.203125
Q 37.796875 6.203125 41.984375 11.859375
Q 46.1875 17.53125 46.1875 27.296875
Q 46.1875 37.015625 41.984375 42.703125
Q 37.796875 48.390625 30.609375 48.390625
M 30.609375 56
Q 42.328125 56 49.015625 48.375
Q 55.71875 40.765625 55.71875 27.296875
Q 55.71875 13.875 49.015625 6.21875
Q 42.328125 -1.421875 30.609375 -1.421875
Q 18.84375 -1.421875 12.171875 6.21875
Q 5.515625 13.875 5.515625 27.296875
Q 5.515625 40.765625 12.171875 48.375
Q 18.84375 56 30.609375 56
" id="DejaVuSans-6f"/>
<path d="M 9.421875 75.984375
L 18.40625 75.984375
L 18.40625 0
L 9.421875 0
z
" id="DejaVuSans-6c"/>
<path d="M 32.171875 -5.078125
Q 28.375 -14.84375 24.75 -17.8125
Q 21.140625 -20.796875 15.09375 -20.796875
L 7.90625 -20.796875
L 7.90625 -13.28125
L 13.1875 -13.28125
Q 16.890625 -13.28125 18.9375 -11.515625
Q 21 -9.765625 23.484375 -3.21875
L 25.09375 0.875
L 2.984375 54.6875
L 12.5 54.6875
L 29.59375 11.921875
L 46.6875 54.6875
L 56.203125 54.6875
z
" id="DejaVuSans-79"/>
<path d="M 54.890625 33.015625
L 54.890625 0
L 45.90625 0
L 45.90625 32.71875
Q 45.90625 40.484375 42.875 44.328125
Q 39.84375 48.1875 33.796875 48.1875
Q 26.515625 48.1875 22.3125 43.546875
Q 18.109375 38.921875 18.109375 30.90625
L 18.109375 0
L 9.078125 0
L 9.078125 54.6875
L 18.109375 54.6875
L 18.109375 46.1875
Q 21.34375 51.125 25.703125 53.5625
Q 30.078125 56 35.796875 56
Q 45.21875 56 50.046875 50.171875
Q 54.890625 44.34375 54.890625 33.015625
" id="DejaVuSans-6e"/>
<path d="M 30.609375 48.390625
Q 23.390625 48.390625 19.1875 42.75
Q 14.984375 37.109375 14.984375 27.296875
Q 14.984375 17.484375 19.15625 11.84375
Q 23.34375 6.203125 30.609375 6.203125
Q 37.796875 6.203125 41.984375 11.859375
Q 46.1875 17.53125 46.1875 27.296875
Q 46.1875 37.015625 41.984375 42.703125
Q 37.796875 48.390625 30.609375 48.390625
M 30.609375 56
Q 42.328125 56 49.015625 48.375
Q 55.71875 40.765625 55.71875 27.296875
Q 55.71875 13.875 49.015625 6.21875
Q 42.328125 -1.421875 30.609375 -1.421875
Q 18.84375 -1.421875 12.171875 6.21875
Q 5.515625 13.875 5.515625 27.296875
Q 5.515625 40.765625 12.171875 48.375
Q 18.84375 56 30.609375 56
M 27.015625 79.984375
L 34.234375 79.984375
L 46.203125 61.625
L 39.421875 61.625
L 30.625 73.578125
L 21.84375 61.625
L 15.046875 61.625
z
" id="DejaVuSans-f4"/>
<path d="M 52 44.1875
Q 55.375 50.25 60.0625 53.125
Q 64.75 56 71.09375 56
Q 79.640625 56 84.28125 50.015625
Q 88.921875 44.046875 88.921875 33.015625
L 88.921875 0
L 79.890625 0
L 79.890625 32.71875
Q 79.890625 40.578125 77.09375 44.375
Q 74.3125 48.1875 68.609375 48.1875
Q 61.625 48.1875 57.5625 43.546875
Q 53.515625 38.921875 53.515625 30.90625
L 53.515625 0
L 44.484375 0
L 44.484375 32.71875
Q 44.484375 40.625 41.703125 44.40625
Q 38.921875 48.1875 33.109375 48.1875
Q 26.21875 48.1875 22.15625 43.53125
Q 18.109375 38.875 18.109375 30.90625
L 18.109375 0
L 9.078125 0
L 9.078125 54.6875
L 18.109375 54.6875
L 18.109375 46.1875
Q 21.1875 51.21875 25.484375 53.609375
Q 29.78125 56 35.6875 56
Q 41.65625 56 45.828125 52.96875
Q 50 49.953125 52 44.1875
" id="DejaVuSans-6d"/>
</defs>
<g transform="translate(69.55 162.042188)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-70"/>
<use x="63.476562" xlink:href="#DejaVuSans-6f"/>
<use x="124.658203" xlink:href="#DejaVuSans-6c"/>
<use x="152.441406" xlink:href="#DejaVuSans-79"/>
<use x="211.621094" xlink:href="#DejaVuSans-6e"/>
<use x="275" xlink:href="#DejaVuSans-f4"/>
<use x="336.181641" xlink:href="#DejaVuSans-6d"/>
<use x="433.59375" xlink:href="#DejaVuSans-65"/>
</g>
</g>
<g id="line2d_19">
<path d="M 41.55 173.620313
L 61.55 173.620313
" style="fill:none;stroke:#ff7f0e;stroke-linecap:square;stroke-width:1.5;"/>
</g>
<g id="line2d_20"/>
<g id="text_17">
<!-- recalculé par la méthode de Horner -->
<defs>
<path d="M 41.109375 46.296875
Q 39.59375 47.171875 37.8125 47.578125
Q 36.03125 48 33.890625 48
Q 26.265625 48 22.1875 43.046875
Q 18.109375 38.09375 18.109375 28.8125
L 18.109375 0
L 9.078125 0
L 9.078125 54.6875
L 18.109375 54.6875
L 18.109375 46.1875
Q 20.953125 51.171875 25.484375 53.578125
Q 30.03125 56 36.53125 56
Q 37.453125 56 38.578125 55.875
Q 39.703125 55.765625 41.0625 55.515625
z
" id="DejaVuSans-72"/>
<path d="M 48.78125 52.59375
L 48.78125 44.1875
Q 44.96875 46.296875 41.140625 47.34375
Q 37.3125 48.390625 33.40625 48.390625
Q 24.65625 48.390625 19.8125 42.84375
Q 14.984375 37.3125 14.984375 27.296875
Q 14.984375 17.28125 19.8125 11.734375
Q 24.65625 6.203125 33.40625 6.203125
Q 37.3125 6.203125 41.140625 7.25
Q 44.96875 8.296875 48.78125 10.40625
L 48.78125 2.09375
Q 45.015625 0.34375 40.984375 -0.53125
Q 36.96875 -1.421875 32.421875 -1.421875
Q 20.0625 -1.421875 12.78125 6.34375
Q 5.515625 14.109375 5.515625 27.296875
Q 5.515625 40.671875 12.859375 48.328125
Q 20.21875 56 33.015625 56
Q 37.15625 56 41.109375 55.140625
Q 45.0625 54.296875 48.78125 52.59375
" id="DejaVuSans-63"/>
<path d="M 34.28125 27.484375
Q 23.390625 27.484375 19.1875 25
Q 14.984375 22.515625 14.984375 16.5
Q 14.984375 11.71875 18.140625 8.90625
Q 21.296875 6.109375 26.703125 6.109375
Q 34.1875 6.109375 38.703125 11.40625
Q 43.21875 16.703125 43.21875 25.484375
L 43.21875 27.484375
z
M 52.203125 31.203125
L 52.203125 0
L 43.21875 0
L 43.21875 8.296875
Q 40.140625 3.328125 35.546875 0.953125
Q 30.953125 -1.421875 24.3125 -1.421875
Q 15.921875 -1.421875 10.953125 3.296875
Q 6 8.015625 6 15.921875
Q 6 25.140625 12.171875 29.828125
Q 18.359375 34.515625 30.609375 34.515625
L 43.21875 34.515625
L 43.21875 35.40625
Q 43.21875 41.609375 39.140625 45
Q 35.0625 48.390625 27.6875 48.390625
Q 23 48.390625 18.546875 47.265625
Q 14.109375 46.140625 10.015625 43.890625
L 10.015625 52.203125
Q 14.9375 54.109375 19.578125 55.046875
Q 24.21875 56 28.609375 56
Q 40.484375 56 46.34375 49.84375
Q 52.203125 43.703125 52.203125 31.203125
" id="DejaVuSans-61"/>
<path d="M 8.5 21.578125
L 8.5 54.6875
L 17.484375 54.6875
L 17.484375 21.921875
Q 17.484375 14.15625 20.5 10.265625
Q 23.53125 6.390625 29.59375 6.390625
Q 36.859375 6.390625 41.078125 11.03125
Q 45.3125 15.671875 45.3125 23.6875
L 45.3125 54.6875
L 54.296875 54.6875
L 54.296875 0
L 45.3125 0
L 45.3125 8.40625
Q 42.046875 3.421875 37.71875 1
Q 33.40625 -1.421875 27.6875 -1.421875
Q 18.265625 -1.421875 13.375 4.4375
Q 8.5 10.296875 8.5 21.578125
M 31.109375 56
z
" id="DejaVuSans-75"/>
<path d="M 56.203125 29.59375
L 56.203125 25.203125
L 14.890625 25.203125
Q 15.484375 15.921875 20.484375 11.0625
Q 25.484375 6.203125 34.421875 6.203125
Q 39.59375 6.203125 44.453125 7.46875
Q 49.3125 8.734375 54.109375 11.28125
L 54.109375 2.78125
Q 49.265625 0.734375 44.1875 -0.34375
Q 39.109375 -1.421875 33.890625 -1.421875
Q 20.796875 -1.421875 13.15625 6.1875
Q 5.515625 13.8125 5.515625 26.8125
Q 5.515625 40.234375 12.765625 48.109375
Q 20.015625 56 32.328125 56
Q 43.359375 56 49.78125 48.890625
Q 56.203125 41.796875 56.203125 29.59375
M 47.21875 32.234375
Q 47.125 39.59375 43.09375 43.984375
Q 39.0625 48.390625 32.421875 48.390625
Q 24.90625 48.390625 20.390625 44.140625
Q 15.875 39.890625 15.1875 32.171875
z
M 38.53125 79.984375
L 48.25 79.984375
L 32.34375 61.625
L 24.859375 61.625
z
" id="DejaVuSans-e9"/>
<path id="DejaVuSans-20"/>
<path d="M 18.3125 70.21875
L 18.3125 54.6875
L 36.8125 54.6875
L 36.8125 47.703125
L 18.3125 47.703125
L 18.3125 18.015625
Q 18.3125 11.328125 20.140625 9.421875
Q 21.96875 7.515625 27.59375 7.515625
L 36.8125 7.515625
L 36.8125 0
L 27.59375 0
Q 17.1875 0 13.234375 3.875
Q 9.28125 7.765625 9.28125 18.015625
L 9.28125 47.703125
L 2.6875 47.703125
L 2.6875 54.6875
L 9.28125 54.6875
L 9.28125 70.21875
z
" id="DejaVuSans-74"/>
<path d="M 54.890625 33.015625
L 54.890625 0
L 45.90625 0
L 45.90625 32.71875
Q 45.90625 40.484375 42.875 44.328125
Q 39.84375 48.1875 33.796875 48.1875
Q 26.515625 48.1875 22.3125 43.546875
Q 18.109375 38.921875 18.109375 30.90625
L 18.109375 0
L 9.078125 0
L 9.078125 75.984375
L 18.109375 75.984375
L 18.109375 46.1875
Q 21.34375 51.125 25.703125 53.5625
Q 30.078125 56 35.796875 56
Q 45.21875 56 50.046875 50.171875
Q 54.890625 44.34375 54.890625 33.015625
" id="DejaVuSans-68"/>
<path d="M 45.40625 46.390625
L 45.40625 75.984375
L 54.390625 75.984375
L 54.390625 0
L 45.40625 0
L 45.40625 8.203125
Q 42.578125 3.328125 38.25 0.953125
Q 33.9375 -1.421875 27.875 -1.421875
Q 17.96875 -1.421875 11.734375 6.484375
Q 5.515625 14.40625 5.515625 27.296875
Q 5.515625 40.1875 11.734375 48.09375
Q 17.96875 56 27.875 56
Q 33.9375 56 38.25 53.625
Q 42.578125 51.265625 45.40625 46.390625
M 14.796875 27.296875
Q 14.796875 17.390625 18.875 11.75
Q 22.953125 6.109375 30.078125 6.109375
Q 37.203125 6.109375 41.296875 11.75
Q 45.40625 17.390625 45.40625 27.296875
Q 45.40625 37.203125 41.296875 42.84375
Q 37.203125 48.484375 30.078125 48.484375
Q 22.953125 48.484375 18.875 42.84375
Q 14.796875 37.203125 14.796875 27.296875
" id="DejaVuSans-64"/>
<path d="M 9.8125 72.90625
L 19.671875 72.90625
L 19.671875 43.015625
L 55.515625 43.015625
L 55.515625 72.90625
L 65.375 72.90625
L 65.375 0
L 55.515625 0
L 55.515625 34.71875
L 19.671875 34.71875
L 19.671875 0
L 9.8125 0
z
" id="DejaVuSans-48"/>
</defs>
<g transform="translate(69.55 177.120313)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-72"/>
<use x="41.082031" xlink:href="#DejaVuSans-65"/>
<use x="102.605469" xlink:href="#DejaVuSans-63"/>
<use x="157.585938" xlink:href="#DejaVuSans-61"/>
<use x="218.865234" xlink:href="#DejaVuSans-6c"/>
<use x="246.648438" xlink:href="#DejaVuSans-63"/>
<use x="301.628906" xlink:href="#DejaVuSans-75"/>
<use x="365.007812" xlink:href="#DejaVuSans-6c"/>
<use x="392.791016" xlink:href="#DejaVuSans-e9"/>
<use x="454.314453" xlink:href="#DejaVuSans-20"/>
<use x="486.101562" xlink:href="#DejaVuSans-70"/>
<use x="549.578125" xlink:href="#DejaVuSans-61"/>
<use x="610.857422" xlink:href="#DejaVuSans-72"/>
<use x="651.970703" xlink:href="#DejaVuSans-20"/>
<use x="683.757812" xlink:href="#DejaVuSans-6c"/>
<use x="711.541016" xlink:href="#DejaVuSans-61"/>
<use x="772.820312" xlink:href="#DejaVuSans-20"/>
<use x="804.607422" xlink:href="#DejaVuSans-6d"/>
<use x="902.019531" xlink:href="#DejaVuSans-e9"/>
<use x="963.542969" xlink:href="#DejaVuSans-74"/>
<use x="1002.751953" xlink:href="#DejaVuSans-68"/>
<use x="1066.130859" xlink:href="#DejaVuSans-6f"/>
<use x="1127.3125" xlink:href="#DejaVuSans-64"/>
<use x="1190.789062" xlink:href="#DejaVuSans-65"/>
<use x="1252.3125" xlink:href="#DejaVuSans-20"/>
<use x="1284.099609" xlink:href="#DejaVuSans-64"/>
<use x="1347.576172" xlink:href="#DejaVuSans-65"/>
<use x="1409.099609" xlink:href="#DejaVuSans-20"/>
<use x="1440.886719" xlink:href="#DejaVuSans-48"/>
<use x="1516.082031" xlink:href="#DejaVuSans-6f"/>
<use x="1577.263672" xlink:href="#DejaVuSans-72"/>
<use x="1618.361328" xlink:href="#DejaVuSans-6e"/>
<use x="1681.740234" xlink:href="#DejaVuSans-65"/>
<use x="1743.263672" xlink:href="#DejaVuSans-72"/>
</g>
</g>
</g>
</g>
</g>
<defs>
<clipPath id="pcc37a37619">
<rect height="166.4" width="385.15" x="32.55" y="21.8"/>
</clipPath>
</defs>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with matplotlib (http://matplotlib.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
height="216pt"
version="1.1"
viewBox="0 0 432 216"
width="432pt"
id="svg2"
inkscape:version="0.91 r13725"
sodipodi:docname="polynome3-4.svg">
<metadata
id="metadata453">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1217"
inkscape:window-height="881"
id="namedview451"
showgrid="false"
inkscape:zoom="1.31"
inkscape:cx="339.08397"
inkscape:cy="135"
inkscape:window-x="287"
inkscape:window-y="42"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" />
<defs
id="defs4">
<marker
inkscape:stockid="Arrow1Lstart"
orient="auto"
refY="0.0"
refX="0.0"
id="marker4935"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4937"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
transform="scale(0.8) translate(12.5,0)" />
</marker>
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0.0"
refX="0.0"
id="marker4895"
style="overflow:visible;"
inkscape:isstock="true">
<path
id="path4897"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
transform="scale(0.8) rotate(180) translate(12.5,0)" />
</marker>
<marker
inkscape:stockid="Arrow1Lstart"
orient="auto"
refY="0.0"
refX="0.0"
id="marker4891"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4893"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
transform="scale(0.8) translate(12.5,0)" />
</marker>
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0.0"
refX="0.0"
id="marker4863"
style="overflow:visible;"
inkscape:isstock="true">
<path
id="path4865"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
transform="scale(0.8) rotate(180) translate(12.5,0)" />
</marker>
<marker
inkscape:stockid="Arrow1Lstart"
orient="auto"
refY="0.0"
refX="0.0"
id="marker4859"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4861"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
transform="scale(0.8) translate(12.5,0)" />
</marker>
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0.0"
refX="0.0"
id="Arrow1Lend"
style="overflow:visible;"
inkscape:isstock="true">
<path
id="path4590"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
transform="scale(0.8) rotate(180) translate(12.5,0)" />
</marker>
<marker
inkscape:stockid="Arrow1Lstart"
orient="auto"
refY="0.0"
refX="0.0"
id="Arrow1Lstart"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4587"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
transform="scale(0.8) translate(12.5,0)" />
</marker>
<style
type="text/css"
id="style6">
*{stroke-linecap:butt;stroke-linejoin:round;}
</style>
</defs>
<g
id="figure_1">
<g
id="patch_1">
<path
d="M 0 216 L 432 216 L 432 0 L 0 0 z "
style="fill:#ffffff;"
id="path10" />
</g>
<g
id="axes_1">
<g
id="patch_2">
<path
d="M 32.55 188.2 L 417.7 188.2 L 417.7 21.8 L 32.55 21.8 z "
style="fill:#ffffff;"
id="path14" />
</g>
<g
id="matplotlib.axis_1">
<g
id="xtick_1">
<g
id="line2d_1">
<defs
id="defs19">
<path
d="M 0 0 L 0 3.5 "
id="mf875541201"
style="stroke:#000000;stroke-width:0.8;" />
</defs>
<g
id="g22">
<use
style="stroke:#000000;stroke-width:0.8;"
x="50.056818"
xlink:href="#mf875541201"
y="188.2"
id="use24" />
</g>
</g>
<g
id="text_1">
<!-- 0.80 -->
<defs
id="defs27">
<path
d="M 31.78125 66.40625 Q 24.171875 66.40625 20.328125 58.90625 Q 16.5 51.421875 16.5 36.375 Q 16.5 21.390625 20.328125 13.890625 Q 24.171875 6.390625 31.78125 6.390625 Q 39.453125 6.390625 43.28125 13.890625 Q 47.125 21.390625 47.125 36.375 Q 47.125 51.421875 43.28125 58.90625 Q 39.453125 66.40625 31.78125 66.40625 M 31.78125 74.21875 Q 44.046875 74.21875 50.515625 64.515625 Q 56.984375 54.828125 56.984375 36.375 Q 56.984375 17.96875 50.515625 8.265625 Q 44.046875 -1.421875 31.78125 -1.421875 Q 19.53125 -1.421875 13.0625 8.265625 Q 6.59375 17.96875 6.59375 36.375 Q 6.59375 54.828125 13.0625 64.515625 Q 19.53125 74.21875 31.78125 74.21875 "
id="DejaVuSans-30" />
<path
d="M 10.6875 12.40625 L 21 12.40625 L 21 0 L 10.6875 0 z "
id="DejaVuSans-2e" />
<path
d="M 31.78125 34.625 Q 24.75 34.625 20.71875 30.859375 Q 16.703125 27.09375 16.703125 20.515625 Q 16.703125 13.921875 20.71875 10.15625 Q 24.75 6.390625 31.78125 6.390625 Q 38.8125 6.390625 42.859375 10.171875 Q 46.921875 13.96875 46.921875 20.515625 Q 46.921875 27.09375 42.890625 30.859375 Q 38.875 34.625 31.78125 34.625 M 21.921875 38.8125 Q 15.578125 40.375 12.03125 44.71875 Q 8.5 49.078125 8.5 55.328125 Q 8.5 64.0625 14.71875 69.140625 Q 20.953125 74.21875 31.78125 74.21875 Q 42.671875 74.21875 48.875 69.140625 Q 55.078125 64.0625 55.078125 55.328125 Q 55.078125 49.078125 51.53125 44.71875 Q 48 40.375 41.703125 38.8125 Q 48.828125 37.15625 52.796875 32.3125 Q 56.78125 27.484375 56.78125 20.515625 Q 56.78125 9.90625 50.3125 4.234375 Q 43.84375 -1.421875 31.78125 -1.421875 Q 19.734375 -1.421875 13.25 4.234375 Q 6.78125 9.90625 6.78125 20.515625 Q 6.78125 27.484375 10.78125 32.3125 Q 14.796875 37.15625 21.921875 38.8125 M 18.3125 54.390625 Q 18.3125 48.734375 21.84375 45.5625 Q 25.390625 42.390625 31.78125 42.390625 Q 38.140625 42.390625 41.71875 45.5625 Q 45.3125 48.734375 45.3125 54.390625 Q 45.3125 60.0625 41.71875 63.234375 Q 38.140625 66.40625 31.78125 66.40625 Q 25.390625 66.40625 21.84375 63.234375 Q 18.3125 60.0625 18.3125 54.390625 "
id="DejaVuSans-38" />
</defs>
<g
transform="translate(38.924006 202.798438)scale(0.1 -0.1)"
id="g32">
<use
xlink:href="#DejaVuSans-30"
id="use34" />
<use
x="63.623047"
xlink:href="#DejaVuSans-2e"
id="use36" />
<use
x="95.410156"
xlink:href="#DejaVuSans-38"
id="use38" />
<use
x="159.033203"
xlink:href="#DejaVuSans-30"
id="use40" />
</g>
</g>
</g>
<g
id="xtick_2">
<g
id="line2d_2">
<g
id="g44">
<use
style="stroke:#000000;stroke-width:0.8;"
x="93.823864"
xlink:href="#mf875541201"
y="188.2"
id="use46" />
</g>
</g>
<g
id="text_2">
<!-- 0.85 -->
<defs
id="defs49">
<path
d="M 10.796875 72.90625 L 49.515625 72.90625 L 49.515625 64.59375 L 19.828125 64.59375 L 19.828125 46.734375 Q 21.96875 47.46875 24.109375 47.828125 Q 26.265625 48.1875 28.421875 48.1875 Q 40.625 48.1875 47.75 41.5 Q 54.890625 34.8125 54.890625 23.390625 Q 54.890625 11.625 47.5625 5.09375 Q 40.234375 -1.421875 26.90625 -1.421875 Q 22.3125 -1.421875 17.546875 -0.640625 Q 12.796875 0.140625 7.71875 1.703125 L 7.71875 11.625 Q 12.109375 9.234375 16.796875 8.0625 Q 21.484375 6.890625 26.703125 6.890625 Q 35.15625 6.890625 40.078125 11.328125 Q 45.015625 15.765625 45.015625 23.390625 Q 45.015625 31 40.078125 35.4375 Q 35.15625 39.890625 26.703125 39.890625 Q 22.75 39.890625 18.8125 39.015625 Q 14.890625 38.140625 10.796875 36.28125 z "
id="DejaVuSans-35" />
</defs>
<g
transform="translate(82.691051 202.798438)scale(0.1 -0.1)"
id="g52">
<use
xlink:href="#DejaVuSans-30"
id="use54" />
<use
x="63.623047"
xlink:href="#DejaVuSans-2e"
id="use56" />
<use
x="95.410156"
xlink:href="#DejaVuSans-38"
id="use58" />
<use
x="159.033203"
xlink:href="#DejaVuSans-35"
id="use60" />
</g>
</g>
</g>
<g
id="xtick_3">
<g
id="line2d_3">
<g
id="g64">
<use
style="stroke:#000000;stroke-width:0.8;"
x="137.590909"
xlink:href="#mf875541201"
y="188.2"
id="use66" />
</g>
</g>
<g
id="text_3">
<!-- 0.90 -->
<defs
id="defs69">
<path
d="M 10.984375 1.515625 L 10.984375 10.5 Q 14.703125 8.734375 18.5 7.8125 Q 22.3125 6.890625 25.984375 6.890625 Q 35.75 6.890625 40.890625 13.453125 Q 46.046875 20.015625 46.78125 33.40625 Q 43.953125 29.203125 39.59375 26.953125 Q 35.25 24.703125 29.984375 24.703125 Q 19.046875 24.703125 12.671875 31.3125 Q 6.296875 37.9375 6.296875 49.421875 Q 6.296875 60.640625 12.9375 67.421875 Q 19.578125 74.21875 30.609375 74.21875 Q 43.265625 74.21875 49.921875 64.515625 Q 56.59375 54.828125 56.59375 36.375 Q 56.59375 19.140625 48.40625 8.859375 Q 40.234375 -1.421875 26.421875 -1.421875 Q 22.703125 -1.421875 18.890625 -0.6875 Q 15.09375 0.046875 10.984375 1.515625 M 30.609375 32.421875 Q 37.25 32.421875 41.125 36.953125 Q 45.015625 41.5 45.015625 49.421875 Q 45.015625 57.28125 41.125 61.84375 Q 37.25 66.40625 30.609375 66.40625 Q 23.96875 66.40625 20.09375 61.84375 Q 16.21875 57.28125 16.21875 49.421875 Q 16.21875 41.5 20.09375 36.953125 Q 23.96875 32.421875 30.609375 32.421875 "
id="DejaVuSans-39" />
</defs>
<g
transform="translate(126.458097 202.798438)scale(0.1 -0.1)"
id="g72">
<use
xlink:href="#DejaVuSans-30"
id="use74" />
<use
x="63.623047"
xlink:href="#DejaVuSans-2e"
id="use76" />
<use
x="95.410156"
xlink:href="#DejaVuSans-39"
id="use78" />
<use
x="159.033203"
xlink:href="#DejaVuSans-30"
id="use80" />
</g>
</g>
</g>
<g
id="xtick_4">
<g
id="line2d_4">
<g
id="g84">
<use
style="stroke:#000000;stroke-width:0.8;"
x="181.357955"
xlink:href="#mf875541201"
y="188.2"
id="use86" />
</g>
</g>
<g
id="text_4">
<!-- 0.95 -->
<g
transform="translate(170.225142 202.798438)scale(0.1 -0.1)"
id="g89">
<use
xlink:href="#DejaVuSans-30"
id="use91" />
<use
x="63.623047"
xlink:href="#DejaVuSans-2e"
id="use93" />
<use
x="95.410156"
xlink:href="#DejaVuSans-39"
id="use95" />
<use
x="159.033203"
xlink:href="#DejaVuSans-35"
id="use97" />
</g>
</g>
</g>
<g
id="xtick_5">
<g
id="line2d_5">
<g
id="g101">
<use
style="stroke:#000000;stroke-width:0.8;"
x="225.125"
xlink:href="#mf875541201"
y="188.2"
id="use103" />
</g>
</g>
<g
id="text_5">
<!-- 1.00 -->
<defs
id="defs106">
<path
d="M 12.40625 8.296875 L 28.515625 8.296875 L 28.515625 63.921875 L 10.984375 60.40625 L 10.984375 69.390625 L 28.421875 72.90625 L 38.28125 72.90625 L 38.28125 8.296875 L 54.390625 8.296875 L 54.390625 0 L 12.40625 0 z "
id="DejaVuSans-31" />
</defs>
<g
transform="translate(213.992188 202.798438)scale(0.1 -0.1)"
id="g109">
<use
xlink:href="#DejaVuSans-31"
id="use111" />
<use
x="63.623047"
xlink:href="#DejaVuSans-2e"
id="use113" />
<use
x="95.410156"
xlink:href="#DejaVuSans-30"
id="use115" />
<use
x="159.033203"
xlink:href="#DejaVuSans-30"
id="use117" />
</g>
</g>
</g>
<g
id="xtick_6">
<g
id="line2d_6">
<g
id="g121">
<use
style="stroke:#000000;stroke-width:0.8;"
x="268.892045"
xlink:href="#mf875541201"
y="188.2"
id="use123" />
</g>
</g>
<g
id="text_6">
<!-- 1.05 -->
<g
transform="translate(257.759233 202.798438)scale(0.1 -0.1)"
id="g126">
<use
xlink:href="#DejaVuSans-31"
id="use128" />
<use
x="63.623047"
xlink:href="#DejaVuSans-2e"
id="use130" />
<use
x="95.410156"
xlink:href="#DejaVuSans-30"
id="use132" />
<use
x="159.033203"
xlink:href="#DejaVuSans-35"
id="use134" />
</g>
</g>
</g>
<g
id="xtick_7">
<g
id="line2d_7">
<g
id="g138">
<use
style="stroke:#000000;stroke-width:0.8;"
x="312.659091"
xlink:href="#mf875541201"
y="188.2"
id="use140" />
</g>
</g>
<g
id="text_7">
<!-- 1.10 -->
<g
transform="translate(301.526278 202.798438)scale(0.1 -0.1)"
id="g143">
<use
xlink:href="#DejaVuSans-31"
id="use145" />
<use
x="63.623047"
xlink:href="#DejaVuSans-2e"
id="use147" />
<use
x="95.410156"
xlink:href="#DejaVuSans-31"
id="use149" />
<use
x="159.033203"
xlink:href="#DejaVuSans-30"
id="use151" />
</g>
</g>
</g>
<g
id="xtick_8">
<g
id="line2d_8">
<g
id="g155">
<use
style="stroke:#000000;stroke-width:0.8;"
x="356.426136"
xlink:href="#mf875541201"
y="188.2"
id="use157" />
</g>
</g>
<g
id="text_8">
<!-- 1.15 -->
<g
transform="translate(345.293324 202.798438)scale(0.1 -0.1)"
id="g160">
<use
xlink:href="#DejaVuSans-31"
id="use162" />
<use
x="63.623047"
xlink:href="#DejaVuSans-2e"
id="use164" />
<use
x="95.410156"
xlink:href="#DejaVuSans-31"
id="use166" />
<use
x="159.033203"
xlink:href="#DejaVuSans-35"
id="use168" />
</g>
</g>
</g>
<g
id="xtick_9">
<g
id="line2d_9">
<g
id="g172">
<use
style="stroke:#000000;stroke-width:0.8;"
x="400.193182"
xlink:href="#mf875541201"
y="188.2"
id="use174" />
</g>
</g>
<g
id="text_9">
<!-- 1.20 -->
<defs
id="defs177">
<path
d="M 19.1875 8.296875 L 53.609375 8.296875 L 53.609375 0 L 7.328125 0 L 7.328125 8.296875 Q 12.9375 14.109375 22.625 23.890625 Q 32.328125 33.6875 34.8125 36.53125 Q 39.546875 41.84375 41.421875 45.53125 Q 43.3125 49.21875 43.3125 52.78125 Q 43.3125 58.59375 39.234375 62.25 Q 35.15625 65.921875 28.609375 65.921875 Q 23.96875 65.921875 18.8125 64.3125 Q 13.671875 62.703125 7.8125 59.421875 L 7.8125 69.390625 Q 13.765625 71.78125 18.9375 73 Q 24.125 74.21875 28.421875 74.21875 Q 39.75 74.21875 46.484375 68.546875 Q 53.21875 62.890625 53.21875 53.421875 Q 53.21875 48.921875 51.53125 44.890625 Q 49.859375 40.875 45.40625 35.40625 Q 44.1875 33.984375 37.640625 27.21875 Q 31.109375 20.453125 19.1875 8.296875 "
id="DejaVuSans-32" />
</defs>
<g
transform="translate(389.060369 202.798438)scale(0.1 -0.1)"
id="g180">
<use
xlink:href="#DejaVuSans-31"
id="use182" />
<use
x="63.623047"
xlink:href="#DejaVuSans-2e"
id="use184" />
<use
x="95.410156"
xlink:href="#DejaVuSans-32"
id="use186" />
<use
x="159.033203"
xlink:href="#DejaVuSans-30"
id="use188" />
</g>
</g>
</g>
</g>
<g
id="matplotlib.axis_2">
<g
id="ytick_1">
<g
id="line2d_10">
<defs
id="defs193">
<path
d="M 0 0 L -3.5 0 "
id="m87b7e82d4d"
style="stroke:#000000;stroke-width:0.8;" />
</defs>
<g
id="g196">
<use
style="stroke:#000000;stroke-width:0.8;"
x="32.55"
xlink:href="#m87b7e82d4d"
y="164.090909"
id="use198" />
</g>
</g>
<g
id="text_10">
<!-- −4 -->
<defs
id="defs201">
<path
d="M 10.59375 35.5 L 73.1875 35.5 L 73.1875 27.203125 L 10.59375 27.203125 z "
id="DejaVuSans-2212" />
<path
d="M 37.796875 64.3125 L 12.890625 25.390625 L 37.796875 25.390625 z M 35.203125 72.90625 L 47.609375 72.90625 L 47.609375 25.390625 L 58.015625 25.390625 L 58.015625 17.1875 L 47.609375 17.1875 L 47.609375 0 L 37.796875 0 L 37.796875 17.1875 L 4.890625 17.1875 L 4.890625 26.703125 z "
id="DejaVuSans-34" />
</defs>
<g
transform="translate(10.807813 167.890128)scale(0.1 -0.1)"
id="g205">
<use
xlink:href="#DejaVuSans-2212"
id="use207" />
<use
x="83.789062"
xlink:href="#DejaVuSans-34"
id="use209" />
</g>
</g>
</g>
<g
id="ytick_2">
<g
id="line2d_11">
<g
id="g213">
<use
style="stroke:#000000;stroke-width:0.8;"
x="32.55"
xlink:href="#m87b7e82d4d"
y="134.545455"
id="use215" />
</g>
</g>
<g
id="text_11">
<!-- −2 -->
<g
transform="translate(10.807813 138.344674)scale(0.1 -0.1)"
id="g218">
<use
xlink:href="#DejaVuSans-2212"
id="use220" />
<use
x="83.789062"
xlink:href="#DejaVuSans-32"
id="use222" />
</g>
</g>
</g>
<g
id="ytick_3">
<g
id="line2d_12">
<g
id="g226">
<use
style="stroke:#000000;stroke-width:0.8;"
x="32.55"
xlink:href="#m87b7e82d4d"
y="105.000001"
id="use228" />
</g>
</g>
<g
id="text_12">
<!-- 0 -->
<g
transform="translate(19.1875 108.79922)scale(0.1 -0.1)"
id="g231">
<use
xlink:href="#DejaVuSans-30"
id="use233" />
</g>
</g>
</g>
<g
id="ytick_4">
<g
id="line2d_13">
<g
id="g237">
<use
style="stroke:#000000;stroke-width:0.8;"
x="32.55"
xlink:href="#m87b7e82d4d"
y="75.454547"
id="use239" />
</g>
</g>
<g
id="text_13">
<!-- 2 -->
<g
transform="translate(19.1875 79.253766)scale(0.1 -0.1)"
id="g242">
<use
xlink:href="#DejaVuSans-32"
id="use244" />
</g>
</g>
</g>
<g
id="ytick_5">
<g
id="line2d_14">
<g
id="g248">
<use
style="stroke:#000000;stroke-width:0.8;"
x="32.55"
xlink:href="#m87b7e82d4d"
y="45.909093"
id="use250" />
</g>
</g>
<g
id="text_14">
<!-- 4 -->
<g
transform="translate(19.1875 49.708312)scale(0.1 -0.1)"
id="g253">
<use
xlink:href="#DejaVuSans-34"
id="use255" />
</g>
</g>
</g>
<g
id="text_15">
<!-- 1e−7 -->
<defs
id="defs258">
<path
d="M 56.203125 29.59375 L 56.203125 25.203125 L 14.890625 25.203125 Q 15.484375 15.921875 20.484375 11.0625 Q 25.484375 6.203125 34.421875 6.203125 Q 39.59375 6.203125 44.453125 7.46875 Q 49.3125 8.734375 54.109375 11.28125 L 54.109375 2.78125 Q 49.265625 0.734375 44.1875 -0.34375 Q 39.109375 -1.421875 33.890625 -1.421875 Q 20.796875 -1.421875 13.15625 6.1875 Q 5.515625 13.8125 5.515625 26.8125 Q 5.515625 40.234375 12.765625 48.109375 Q 20.015625 56 32.328125 56 Q 43.359375 56 49.78125 48.890625 Q 56.203125 41.796875 56.203125 29.59375 M 47.21875 32.234375 Q 47.125 39.59375 43.09375 43.984375 Q 39.0625 48.390625 32.421875 48.390625 Q 24.90625 48.390625 20.390625 44.140625 Q 15.875 39.890625 15.1875 32.171875 z "
id="DejaVuSans-65" />
<path
d="M 8.203125 72.90625 L 55.078125 72.90625 L 55.078125 68.703125 L 28.609375 0 L 18.3125 0 L 43.21875 64.59375 L 8.203125 64.59375 z "
id="DejaVuSans-37" />
</defs>
<g
transform="translate(32.55 18.8)scale(0.1 -0.1)"
id="g262">
<use
xlink:href="#DejaVuSans-31"
id="use264" />
<use
x="63.623047"
xlink:href="#DejaVuSans-65"
id="use266" />
<use
x="125.146484"
xlink:href="#DejaVuSans-2212"
id="use268" />
<use
x="208.935547"
xlink:href="#DejaVuSans-37"
id="use270" />
</g>
</g>
</g>
<g
id="line2d_15">
<path
clip-path="url(#p7ec0e234b8)"
d="M 50.056818 180.636364 L 53.593549 167.944747 L 57.13028 157.182673 L 60.667011 148.088405 L 64.203742 140.431246 L 67.740473 134.008412 L 71.277204 128.64216 L 74.813935 124.177157 L 78.350666 120.478066 L 81.887397 117.427366 L 85.424128 114.923337 L 88.960859 112.878262 L 92.49759 111.21678 L 96.03432 109.874383 L 99.571051 108.796114 L 103.107782 107.935324 L 106.644513 107.252616 L 110.181244 106.714883 L 113.717975 106.294433 L 117.254706 105.968237 L 120.791437 105.717268 L 124.328168 105.525882 L 127.864899 105.381309 L 131.40163 105.273213 L 134.938361 105.193264 L 138.475092 105.134829 L 142.011823 105.09266 L 145.548554 105.062653 L 149.085285 105.041612 L 152.622016 105.027108 L 156.158747 105.017283 L 159.695478 105.010761 L 163.232208 105.00653 L 166.768939 105.003846 L 170.30567 105.002192 L 173.842401 105.001202 L 177.379132 105.000633 L 180.915863 105.000314 L 184.452594 105.000152 L 187.989325 105.000065 L 191.526056 105.000029 L 195.062787 105.000009 L 198.599518 105.000006 L 202.136249 105.000002 L 205.67298 105.000003 L 209.209711 104.999999 L 212.746442 105.000002 L 216.283173 105 L 219.819904 105.000004 L 223.356635 105.000002 L 226.893365 105.000005 L 230.430096 105 L 233.966827 104.999997 L 237.503558 104.999998 L 241.040289 105.000006 L 244.57702 105.000007 L 248.113751 105.000003 L 251.650482 105 L 255.187213 104.999991 L 258.723944 104.999977 L 262.260675 104.999935 L 265.797406 104.999852 L 269.334137 104.99969 L 272.870868 104.99937 L 276.407599 104.998802 L 279.94433 104.997812 L 283.481061 104.996159 L 287.017792 104.993479 L 290.554522 104.989242 L 294.091253 104.982721 L 297.627984 104.972894 L 301.164715 104.958388 L 304.701446 104.937353 L 308.238177 104.907339 L 311.774908 104.865178 L 315.311639 104.80674 L 318.84837 104.726795 L 322.385101 104.618684 L 325.921832 104.474124 L 329.458563 104.28273 L 332.995294 104.03176 L 336.532025 103.705571 L 340.068756 103.285113 L 343.605487 102.747385 L 347.142218 102.064678 L 350.678949 101.20389 L 354.21568 100.125624 L 357.75241 98.783223 L 361.289141 97.121739 L 364.825872 95.076667 L 368.362603 92.57264 L 371.899334 89.521931 L 375.436065 85.822847 L 378.972796 81.35784 L 382.509527 75.991594 L 386.046258 69.568752 L 389.582989 61.911599 L 393.11972 52.81731 L 396.656451 42.055256 L 400.193182 29.363637 "
style="fill:none;stroke:#1f77b4;stroke-linecap:square;stroke-width:1.5;"
id="path273" />
</g>
<g
id="line2d_16">
<path
clip-path="url(#p7ec0e234b8)"
d="M 50.056818 180.636363 L 53.593549 167.944748 L 57.13028 157.182676 L 60.667011 148.088406 L 64.203742 140.431246 L 67.740473 134.008413 L 71.277204 128.642162 L 74.813935 124.177157 L 78.350666 120.478067 L 81.887397 117.427365 L 85.424128 114.923337 L 88.960859 112.878262 L 92.49759 111.216777 L 96.03432 109.874384 L 99.571051 108.796113 L 103.107782 107.935322 L 106.644513 107.252617 L 110.181244 106.714883 L 113.717975 106.294432 L 117.254706 105.968239 L 120.791437 105.717269 L 124.328168 105.525882 L 127.864899 105.38131 L 131.40163 105.27321 L 134.938361 105.193262 L 138.475092 105.134829 L 142.011823 105.092661 L 145.548554 105.062651 L 149.085285 105.041615 L 152.622016 105.027106 L 156.158747 105.017283 L 159.695478 105.01076 L 163.232208 105.006527 L 166.768939 105.003844 L 170.30567 105.00219 L 173.842401 105.001202 L 177.379132 105.000633 L 180.915863 105.000317 L 184.452594 105.000149 L 187.989325 105.000067 L 191.526056 105.000029 L 195.062787 105.000012 L 198.599518 105.000005 L 202.136249 105.000002 L 205.67298 105.000001 L 209.209711 105 L 212.746442 105.000001 L 216.283173 105 L 219.819904 105 L 223.356635 105.000002 L 226.893365 105 L 230.430096 105.000001 L 233.966827 105.000001 L 237.503558 105.000002 L 241.040289 104.999999 L 244.57702 104.999999 L 248.113751 105 L 251.650482 104.999997 L 255.187213 104.999991 L 258.723944 104.999973 L 262.260675 104.999934 L 265.797406 104.999851 L 269.334137 104.999685 L 272.870868 104.999371 L 276.407599 104.998799 L 279.94433 104.997812 L 283.481061 104.996158 L 287.017792 104.993475 L 290.554522 104.989243 L 294.091253 104.982719 L 297.627984 104.972894 L 301.164715 104.958389 L 304.701446 104.937351 L 308.238177 104.90734 L 311.774908 104.865174 L 315.311639 104.806737 L 318.84837 104.726793 L 322.385101 104.618693 L 325.921832 104.474119 L 329.458563 104.28273 L 332.995294 104.03176 L 336.532025 103.705573 L 340.068756 103.285117 L 343.605487 102.747384 L 347.142218 102.064682 L 350.678949 101.203887 L 354.21568 100.125621 L 357.75241 98.783227 L 361.289141 97.121736 L 364.825872 95.076666 L 368.362603 92.572639 L 371.899334 89.521933 L 375.436065 85.822843 L 378.972796 81.357841 L 382.509527 75.991589 L 386.046258 69.568759 L 389.582989 61.911596 L 393.11972 52.817328 L 396.656451 42.055256 L 400.193182 29.363636 "
style="fill:none;stroke:#ff7f0e;stroke-linecap:square;stroke-width:1.5;"
id="path276" />
</g>
<g
id="line2d_17">
<path
clip-path="url(#p7ec0e234b8)"
d="M 50.056818 180.636363 L 53.593549 167.944748 L 57.13028 157.182675 L 60.667011 148.088406 L 64.203742 140.431246 L 67.740473 134.008412 L 71.277204 128.642161 L 74.813935 124.177158 L 78.350666 120.478068 L 81.887397 117.427366 L 85.424128 114.923337 L 88.960859 112.878263 L 92.49759 111.216777 L 96.03432 109.874384 L 99.571051 108.796113 L 103.107782 107.935323 L 106.644513 107.252617 L 110.181244 106.714882 L 113.717975 106.294432 L 117.254706 105.96824 L 120.791437 105.71727 L 124.328168 105.525882 L 127.864899 105.381311 L 131.40163 105.273211 L 134.938361 105.193263 L 138.475092 105.134828 L 142.011823 105.092661 L 145.548554 105.062652 L 149.085285 105.041614 L 152.622016 105.027107 L 156.158747 105.017283 L 159.695478 105.010761 L 163.232208 105.006527 L 166.768939 105.003844 L 170.30567 105.00219 L 173.842401 105.001202 L 177.379132 105.000632 L 180.915863 105.000317 L 184.452594 105.00015 L 187.989325 105.000067 L 191.526056 105.000028 L 195.062787 105.000011 L 198.599518 105.000004 L 202.136249 105.000002 L 205.67298 105.000001 L 209.209711 105.000001 L 212.746442 105.000001 L 216.283173 105.000001 L 219.819904 105.000001 L 223.356635 105.000001 L 226.893365 105.000001 L 230.430096 105.000001 L 233.966827 105.000001 L 237.503558 105.000001 L 241.040289 105.000001 L 244.57702 105.000001 L 248.113751 105 L 251.650482 104.999998 L 255.187213 104.999991 L 258.723944 104.999974 L 262.260675 104.999935 L 265.797406 104.999852 L 269.334137 104.999685 L 272.870868 104.99937 L 276.407599 104.9988 L 279.94433 104.997812 L 283.481061 104.996158 L 287.017792 104.993475 L 290.554522 104.989241 L 294.091253 104.982719 L 297.627984 104.972895 L 301.164715 104.958388 L 304.701446 104.93735 L 308.238177 104.90734 L 311.774908 104.865173 L 315.311639 104.806739 L 318.84837 104.726791 L 322.385101 104.618691 L 325.921832 104.47412 L 329.458563 104.282732 L 332.995294 104.031762 L 336.532025 103.70557 L 340.068756 103.28512 L 343.605487 102.747385 L 347.142218 102.064679 L 350.678949 101.203889 L 354.21568 100.125618 L 357.75241 98.783224 L 361.289141 97.121739 L 364.825872 95.076665 L 368.362603 92.572636 L 371.899334 89.521934 L 375.436065 85.822844 L 378.972796 81.357841 L 382.509527 75.99159 L 386.046258 69.568756 L 389.582989 61.911596 L 393.11972 52.817327 L 396.656451 42.055254 L 400.193182 29.363639 "
style="fill:none;stroke:#2ca02c;stroke-linecap:square;stroke-width:1.5;"
id="path279" />
</g>
<g
id="patch_3">
<path
d="M 32.55 188.2 L 32.55 21.8 "
style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"
id="path282" />
</g>
<g
id="patch_4">
<path
d="M 417.7 188.2 L 417.7 21.8 "
style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"
id="path285" />
</g>
<g
id="patch_5">
<path
d="M 32.55 188.2 L 417.7 188.2 "
style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"
id="path288" />
</g>
<g
id="patch_6">
<path
d="M 32.55 21.8 L 417.7 21.8 "
style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"
id="path291" />
</g>
<g
id="legend_1">
<g
id="patch_7">
<path
d="M 39.55 183.2 L 249.990625 183.2 Q 251.990625 183.2 251.990625 181.2 L 251.990625 136.965625 Q 251.990625 134.965625 249.990625 134.965625 L 39.55 134.965625 Q 37.55 134.965625 37.55 136.965625 L 37.55 181.2 Q 37.55 183.2 39.55 183.2 z "
style="fill:#ffffff;opacity:0.8;stroke:#cccccc;stroke-linejoin:miter;"
id="path295" />
</g>
<g
id="line2d_18">
<path
d="M 41.55 143.464063 L 61.55 143.464063 "
style="fill:none;stroke:#1f77b4;stroke-linecap:square;stroke-width:1.5;"
id="path298" />
</g>
<g
id="line2d_19" />
<g
id="text_16">
<!-- polynôme -->
<defs
id="defs302">
<path
d="M 18.109375 8.203125 L 18.109375 -20.796875 L 9.078125 -20.796875 L 9.078125 54.6875 L 18.109375 54.6875 L 18.109375 46.390625 Q 20.953125 51.265625 25.265625 53.625 Q 29.59375 56 35.59375 56 Q 45.5625 56 51.78125 48.09375 Q 58.015625 40.1875 58.015625 27.296875 Q 58.015625 14.40625 51.78125 6.484375 Q 45.5625 -1.421875 35.59375 -1.421875 Q 29.59375 -1.421875 25.265625 0.953125 Q 20.953125 3.328125 18.109375 8.203125 M 48.6875 27.296875 Q 48.6875 37.203125 44.609375 42.84375 Q 40.53125 48.484375 33.40625 48.484375 Q 26.265625 48.484375 22.1875 42.84375 Q 18.109375 37.203125 18.109375 27.296875 Q 18.109375 17.390625 22.1875 11.75 Q 26.265625 6.109375 33.40625 6.109375 Q 40.53125 6.109375 44.609375 11.75 Q 48.6875 17.390625 48.6875 27.296875 "
id="DejaVuSans-70" />
<path
d="M 30.609375 48.390625 Q 23.390625 48.390625 19.1875 42.75 Q 14.984375 37.109375 14.984375 27.296875 Q 14.984375 17.484375 19.15625 11.84375 Q 23.34375 6.203125 30.609375 6.203125 Q 37.796875 6.203125 41.984375 11.859375 Q 46.1875 17.53125 46.1875 27.296875 Q 46.1875 37.015625 41.984375 42.703125 Q 37.796875 48.390625 30.609375 48.390625 M 30.609375 56 Q 42.328125 56 49.015625 48.375 Q 55.71875 40.765625 55.71875 27.296875 Q 55.71875 13.875 49.015625 6.21875 Q 42.328125 -1.421875 30.609375 -1.421875 Q 18.84375 -1.421875 12.171875 6.21875 Q 5.515625 13.875 5.515625 27.296875 Q 5.515625 40.765625 12.171875 48.375 Q 18.84375 56 30.609375 56 "
id="DejaVuSans-6f" />
<path
d="M 9.421875 75.984375 L 18.40625 75.984375 L 18.40625 0 L 9.421875 0 z "
id="DejaVuSans-6c" />
<path
d="M 32.171875 -5.078125 Q 28.375 -14.84375 24.75 -17.8125 Q 21.140625 -20.796875 15.09375 -20.796875 L 7.90625 -20.796875 L 7.90625 -13.28125 L 13.1875 -13.28125 Q 16.890625 -13.28125 18.9375 -11.515625 Q 21 -9.765625 23.484375 -3.21875 L 25.09375 0.875 L 2.984375 54.6875 L 12.5 54.6875 L 29.59375 11.921875 L 46.6875 54.6875 L 56.203125 54.6875 z "
id="DejaVuSans-79" />
<path
d="M 54.890625 33.015625 L 54.890625 0 L 45.90625 0 L 45.90625 32.71875 Q 45.90625 40.484375 42.875 44.328125 Q 39.84375 48.1875 33.796875 48.1875 Q 26.515625 48.1875 22.3125 43.546875 Q 18.109375 38.921875 18.109375 30.90625 L 18.109375 0 L 9.078125 0 L 9.078125 54.6875 L 18.109375 54.6875 L 18.109375 46.1875 Q 21.34375 51.125 25.703125 53.5625 Q 30.078125 56 35.796875 56 Q 45.21875 56 50.046875 50.171875 Q 54.890625 44.34375 54.890625 33.015625 "
id="DejaVuSans-6e" />
<path
d="M 30.609375 48.390625 Q 23.390625 48.390625 19.1875 42.75 Q 14.984375 37.109375 14.984375 27.296875 Q 14.984375 17.484375 19.15625 11.84375 Q 23.34375 6.203125 30.609375 6.203125 Q 37.796875 6.203125 41.984375 11.859375 Q 46.1875 17.53125 46.1875 27.296875 Q 46.1875 37.015625 41.984375 42.703125 Q 37.796875 48.390625 30.609375 48.390625 M 30.609375 56 Q 42.328125 56 49.015625 48.375 Q 55.71875 40.765625 55.71875 27.296875 Q 55.71875 13.875 49.015625 6.21875 Q 42.328125 -1.421875 30.609375 -1.421875 Q 18.84375 -1.421875 12.171875 6.21875 Q 5.515625 13.875 5.515625 27.296875 Q 5.515625 40.765625 12.171875 48.375 Q 18.84375 56 30.609375 56 M 27.015625 79.984375 L 34.234375 79.984375 L 46.203125 61.625 L 39.421875 61.625 L 30.625 73.578125 L 21.84375 61.625 L 15.046875 61.625 z "
id="DejaVuSans-f4" />
<path
d="M 52 44.1875 Q 55.375 50.25 60.0625 53.125 Q 64.75 56 71.09375 56 Q 79.640625 56 84.28125 50.015625 Q 88.921875 44.046875 88.921875 33.015625 L 88.921875 0 L 79.890625 0 L 79.890625 32.71875 Q 79.890625 40.578125 77.09375 44.375 Q 74.3125 48.1875 68.609375 48.1875 Q 61.625 48.1875 57.5625 43.546875 Q 53.515625 38.921875 53.515625 30.90625 L 53.515625 0 L 44.484375 0 L 44.484375 32.71875 Q 44.484375 40.625 41.703125 44.40625 Q 38.921875 48.1875 33.109375 48.1875 Q 26.21875 48.1875 22.15625 43.53125 Q 18.109375 38.875 18.109375 30.90625 L 18.109375 0 L 9.078125 0 L 9.078125 54.6875 L 18.109375 54.6875 L 18.109375 46.1875 Q 21.1875 51.21875 25.484375 53.609375 Q 29.78125 56 35.6875 56 Q 41.65625 56 45.828125 52.96875 Q 50 49.953125 52 44.1875 "
id="DejaVuSans-6d" />
</defs>
<g
transform="translate(69.55 146.964063)scale(0.1 -0.1)"
id="g311">
<use
xlink:href="#DejaVuSans-70"
id="use313" />
<use
x="63.476562"
xlink:href="#DejaVuSans-6f"
id="use315" />
<use
x="124.658203"
xlink:href="#DejaVuSans-6c"
id="use317" />
<use
x="152.441406"
xlink:href="#DejaVuSans-79"
id="use319" />
<use
x="211.621094"
xlink:href="#DejaVuSans-6e"
id="use321" />
<use
x="275"
xlink:href="#DejaVuSans-f4"
id="use323" />
<use
x="336.181641"
xlink:href="#DejaVuSans-6d"
id="use325" />
<use
x="433.59375"
xlink:href="#DejaVuSans-65"
id="use327" />
</g>
</g>
<g
id="line2d_20">
<path
d="M 41.55 158.542188 L 61.55 158.542188 "
style="fill:none;stroke:#ff7f0e;stroke-linecap:square;stroke-width:1.5;"
id="path330" />
</g>
<g
id="line2d_21" />
<g
id="text_17">
<!-- recalculé par la méthode de Horner -->
<defs
id="defs334">
<path
d="M 41.109375 46.296875 Q 39.59375 47.171875 37.8125 47.578125 Q 36.03125 48 33.890625 48 Q 26.265625 48 22.1875 43.046875 Q 18.109375 38.09375 18.109375 28.8125 L 18.109375 0 L 9.078125 0 L 9.078125 54.6875 L 18.109375 54.6875 L 18.109375 46.1875 Q 20.953125 51.171875 25.484375 53.578125 Q 30.03125 56 36.53125 56 Q 37.453125 56 38.578125 55.875 Q 39.703125 55.765625 41.0625 55.515625 z "
id="DejaVuSans-72" />
<path
d="M 48.78125 52.59375 L 48.78125 44.1875 Q 44.96875 46.296875 41.140625 47.34375 Q 37.3125 48.390625 33.40625 48.390625 Q 24.65625 48.390625 19.8125 42.84375 Q 14.984375 37.3125 14.984375 27.296875 Q 14.984375 17.28125 19.8125 11.734375 Q 24.65625 6.203125 33.40625 6.203125 Q 37.3125 6.203125 41.140625 7.25 Q 44.96875 8.296875 48.78125 10.40625 L 48.78125 2.09375 Q 45.015625 0.34375 40.984375 -0.53125 Q 36.96875 -1.421875 32.421875 -1.421875 Q 20.0625 -1.421875 12.78125 6.34375 Q 5.515625 14.109375 5.515625 27.296875 Q 5.515625 40.671875 12.859375 48.328125 Q 20.21875 56 33.015625 56 Q 37.15625 56 41.109375 55.140625 Q 45.0625 54.296875 48.78125 52.59375 "
id="DejaVuSans-63" />
<path
d="M 34.28125 27.484375 Q 23.390625 27.484375 19.1875 25 Q 14.984375 22.515625 14.984375 16.5 Q 14.984375 11.71875 18.140625 8.90625 Q 21.296875 6.109375 26.703125 6.109375 Q 34.1875 6.109375 38.703125 11.40625 Q 43.21875 16.703125 43.21875 25.484375 L 43.21875 27.484375 z M 52.203125 31.203125 L 52.203125 0 L 43.21875 0 L 43.21875 8.296875 Q 40.140625 3.328125 35.546875 0.953125 Q 30.953125 -1.421875 24.3125 -1.421875 Q 15.921875 -1.421875 10.953125 3.296875 Q 6 8.015625 6 15.921875 Q 6 25.140625 12.171875 29.828125 Q 18.359375 34.515625 30.609375 34.515625 L 43.21875 34.515625 L 43.21875 35.40625 Q 43.21875 41.609375 39.140625 45 Q 35.0625 48.390625 27.6875 48.390625 Q 23 48.390625 18.546875 47.265625 Q 14.109375 46.140625 10.015625 43.890625 L 10.015625 52.203125 Q 14.9375 54.109375 19.578125 55.046875 Q 24.21875 56 28.609375 56 Q 40.484375 56 46.34375 49.84375 Q 52.203125 43.703125 52.203125 31.203125 "
id="DejaVuSans-61" />
<path
d="M 8.5 21.578125 L 8.5 54.6875 L 17.484375 54.6875 L 17.484375 21.921875 Q 17.484375 14.15625 20.5 10.265625 Q 23.53125 6.390625 29.59375 6.390625 Q 36.859375 6.390625 41.078125 11.03125 Q 45.3125 15.671875 45.3125 23.6875 L 45.3125 54.6875 L 54.296875 54.6875 L 54.296875 0 L 45.3125 0 L 45.3125 8.40625 Q 42.046875 3.421875 37.71875 1 Q 33.40625 -1.421875 27.6875 -1.421875 Q 18.265625 -1.421875 13.375 4.4375 Q 8.5 10.296875 8.5 21.578125 M 31.109375 56 z "
id="DejaVuSans-75" />
<path
d="M 56.203125 29.59375 L 56.203125 25.203125 L 14.890625 25.203125 Q 15.484375 15.921875 20.484375 11.0625 Q 25.484375 6.203125 34.421875 6.203125 Q 39.59375 6.203125 44.453125 7.46875 Q 49.3125 8.734375 54.109375 11.28125 L 54.109375 2.78125 Q 49.265625 0.734375 44.1875 -0.34375 Q 39.109375 -1.421875 33.890625 -1.421875 Q 20.796875 -1.421875 13.15625 6.1875 Q 5.515625 13.8125 5.515625 26.8125 Q 5.515625 40.234375 12.765625 48.109375 Q 20.015625 56 32.328125 56 Q 43.359375 56 49.78125 48.890625 Q 56.203125 41.796875 56.203125 29.59375 M 47.21875 32.234375 Q 47.125 39.59375 43.09375 43.984375 Q 39.0625 48.390625 32.421875 48.390625 Q 24.90625 48.390625 20.390625 44.140625 Q 15.875 39.890625 15.1875 32.171875 z M 38.53125 79.984375 L 48.25 79.984375 L 32.34375 61.625 L 24.859375 61.625 z "
id="DejaVuSans-e9" />
<path
id="DejaVuSans-20" />
<path
d="M 18.3125 70.21875 L 18.3125 54.6875 L 36.8125 54.6875 L 36.8125 47.703125 L 18.3125 47.703125 L 18.3125 18.015625 Q 18.3125 11.328125 20.140625 9.421875 Q 21.96875 7.515625 27.59375 7.515625 L 36.8125 7.515625 L 36.8125 0 L 27.59375 0 Q 17.1875 0 13.234375 3.875 Q 9.28125 7.765625 9.28125 18.015625 L 9.28125 47.703125 L 2.6875 47.703125 L 2.6875 54.6875 L 9.28125 54.6875 L 9.28125 70.21875 z "
id="DejaVuSans-74" />
<path
d="M 54.890625 33.015625 L 54.890625 0 L 45.90625 0 L 45.90625 32.71875 Q 45.90625 40.484375 42.875 44.328125 Q 39.84375 48.1875 33.796875 48.1875 Q 26.515625 48.1875 22.3125 43.546875 Q 18.109375 38.921875 18.109375 30.90625 L 18.109375 0 L 9.078125 0 L 9.078125 75.984375 L 18.109375 75.984375 L 18.109375 46.1875 Q 21.34375 51.125 25.703125 53.5625 Q 30.078125 56 35.796875 56 Q 45.21875 56 50.046875 50.171875 Q 54.890625 44.34375 54.890625 33.015625 "
id="DejaVuSans-68" />
<path
d="M 45.40625 46.390625 L 45.40625 75.984375 L 54.390625 75.984375 L 54.390625 0 L 45.40625 0 L 45.40625 8.203125 Q 42.578125 3.328125 38.25 0.953125 Q 33.9375 -1.421875 27.875 -1.421875 Q 17.96875 -1.421875 11.734375 6.484375 Q 5.515625 14.40625 5.515625 27.296875 Q 5.515625 40.1875 11.734375 48.09375 Q 17.96875 56 27.875 56 Q 33.9375 56 38.25 53.625 Q 42.578125 51.265625 45.40625 46.390625 M 14.796875 27.296875 Q 14.796875 17.390625 18.875 11.75 Q 22.953125 6.109375 30.078125 6.109375 Q 37.203125 6.109375 41.296875 11.75 Q 45.40625 17.390625 45.40625 27.296875 Q 45.40625 37.203125 41.296875 42.84375 Q 37.203125 48.484375 30.078125 48.484375 Q 22.953125 48.484375 18.875 42.84375 Q 14.796875 37.203125 14.796875 27.296875 "
id="DejaVuSans-64" />
<path
d="M 9.8125 72.90625 L 19.671875 72.90625 L 19.671875 43.015625 L 55.515625 43.015625 L 55.515625 72.90625 L 65.375 72.90625 L 65.375 0 L 55.515625 0 L 55.515625 34.71875 L 19.671875 34.71875 L 19.671875 0 L 9.8125 0 z "
id="DejaVuSans-48" />
</defs>
<g
transform="translate(69.55 162.042188)scale(0.1 -0.1)"
id="g346">
<use
xlink:href="#DejaVuSans-72"
id="use348" />
<use
x="41.082031"
xlink:href="#DejaVuSans-65"
id="use350" />
<use
x="102.605469"
xlink:href="#DejaVuSans-63"
id="use352" />
<use
x="157.585938"
xlink:href="#DejaVuSans-61"
id="use354" />
<use
x="218.865234"
xlink:href="#DejaVuSans-6c"
id="use356" />
<use
x="246.648438"
xlink:href="#DejaVuSans-63"
id="use358" />
<use
x="301.628906"
xlink:href="#DejaVuSans-75"
id="use360" />
<use
x="365.007812"
xlink:href="#DejaVuSans-6c"
id="use362" />
<use
x="392.791016"
xlink:href="#DejaVuSans-e9"
id="use364" />
<use
x="454.314453"
xlink:href="#DejaVuSans-20"
id="use366" />
<use
x="486.101562"
xlink:href="#DejaVuSans-70"
id="use368" />
<use
x="549.578125"
xlink:href="#DejaVuSans-61"
id="use370" />
<use
x="610.857422"
xlink:href="#DejaVuSans-72"
id="use372" />
<use
x="651.970703"
xlink:href="#DejaVuSans-20"
id="use374" />
<use
x="683.757812"
xlink:href="#DejaVuSans-6c"
id="use376" />
<use
x="711.541016"
xlink:href="#DejaVuSans-61"
id="use378" />
<use
x="772.820312"
xlink:href="#DejaVuSans-20"
id="use380" />
<use
x="804.607422"
xlink:href="#DejaVuSans-6d"
id="use382" />
<use
x="902.019531"
xlink:href="#DejaVuSans-e9"
id="use384" />
<use
x="963.542969"
xlink:href="#DejaVuSans-74"
id="use386" />
<use
x="1002.751953"
xlink:href="#DejaVuSans-68"
id="use388" />
<use
x="1066.130859"
xlink:href="#DejaVuSans-6f"
id="use390" />
<use
x="1127.3125"
xlink:href="#DejaVuSans-64"
id="use392" />
<use
x="1190.789062"
xlink:href="#DejaVuSans-65"
id="use394" />
<use
x="1252.3125"
xlink:href="#DejaVuSans-20"
id="use396" />
<use
x="1284.099609"
xlink:href="#DejaVuSans-64"
id="use398" />
<use
x="1347.576172"
xlink:href="#DejaVuSans-65"
id="use400" />
<use
x="1409.099609"
xlink:href="#DejaVuSans-20"
id="use402" />
<use
x="1440.886719"
xlink:href="#DejaVuSans-48"
id="use404" />
<use
x="1516.082031"
xlink:href="#DejaVuSans-6f"
id="use406" />
<use
x="1577.263672"
xlink:href="#DejaVuSans-72"
id="use408" />
<use
x="1618.361328"
xlink:href="#DejaVuSans-6e"
id="use410" />
<use
x="1681.740234"
xlink:href="#DejaVuSans-65"
id="use412" />
<use
x="1743.263672"
xlink:href="#DejaVuSans-72"
id="use414" />
</g>
</g>
<g
id="line2d_22">
<path
d="M 41.55 173.620313 L 61.55 173.620313 "
style="fill:none;stroke:#2ca02c;stroke-linecap:square;stroke-width:1.5;"
id="path417" />
</g>
<g
id="line2d_23" />
<g
id="text_18">
<!-- simplifié -->
<defs
id="defs421">
<path
d="M 44.28125 53.078125 L 44.28125 44.578125 Q 40.484375 46.53125 36.375 47.5 Q 32.28125 48.484375 27.875 48.484375 Q 21.1875 48.484375 17.84375 46.4375 Q 14.5 44.390625 14.5 40.28125 Q 14.5 37.15625 16.890625 35.375 Q 19.28125 33.59375 26.515625 31.984375 L 29.59375 31.296875 Q 39.15625 29.25 43.1875 25.515625 Q 47.21875 21.78125 47.21875 15.09375 Q 47.21875 7.46875 41.1875 3.015625 Q 35.15625 -1.421875 24.609375 -1.421875 Q 20.21875 -1.421875 15.453125 -0.5625 Q 10.6875 0.296875 5.421875 2 L 5.421875 11.28125 Q 10.40625 8.6875 15.234375 7.390625 Q 20.0625 6.109375 24.8125 6.109375 Q 31.15625 6.109375 34.5625 8.28125 Q 37.984375 10.453125 37.984375 14.40625 Q 37.984375 18.0625 35.515625 20.015625 Q 33.0625 21.96875 24.703125 23.78125 L 21.578125 24.515625 Q 13.234375 26.265625 9.515625 29.90625 Q 5.8125 33.546875 5.8125 39.890625 Q 5.8125 47.609375 11.28125 51.796875 Q 16.75 56 26.8125 56 Q 31.78125 56 36.171875 55.265625 Q 40.578125 54.546875 44.28125 53.078125 "
id="DejaVuSans-73" />
<path
d="M 9.421875 54.6875 L 18.40625 54.6875 L 18.40625 0 L 9.421875 0 z M 9.421875 75.984375 L 18.40625 75.984375 L 18.40625 64.59375 L 9.421875 64.59375 z "
id="DejaVuSans-69" />
<path
d="M 37.109375 75.984375 L 37.109375 68.5 L 28.515625 68.5 Q 23.6875 68.5 21.796875 66.546875 Q 19.921875 64.59375 19.921875 59.515625 L 19.921875 54.6875 L 34.71875 54.6875 L 34.71875 47.703125 L 19.921875 47.703125 L 19.921875 0 L 10.890625 0 L 10.890625 47.703125 L 2.296875 47.703125 L 2.296875 54.6875 L 10.890625 54.6875 L 10.890625 58.5 Q 10.890625 67.625 15.140625 71.796875 Q 19.390625 75.984375 28.609375 75.984375 z "
id="DejaVuSans-66" />
</defs>
<g
transform="translate(69.55 177.120313)scale(0.1 -0.1)"
id="g426">
<use
xlink:href="#DejaVuSans-73"
id="use428" />
<use
x="52.099609"
xlink:href="#DejaVuSans-69"
id="use430" />
<use
x="79.882812"
xlink:href="#DejaVuSans-6d"
id="use432" />
<use
x="177.294922"
xlink:href="#DejaVuSans-70"
id="use434" />
<use
x="240.771484"
xlink:href="#DejaVuSans-6c"
id="use436" />
<use
x="268.554688"
xlink:href="#DejaVuSans-69"
id="use438" />
<use
x="296.337891"
xlink:href="#DejaVuSans-66"
id="use440" />
<use
x="331.542969"
xlink:href="#DejaVuSans-69"
id="use442" />
<use
x="359.326172"
xlink:href="#DejaVuSans-e9"
id="use444" />
</g>
</g>
</g>
</g>
</g>
<defs
id="defs446">
<clipPath
id="p7ec0e234b8">
<rect
height="166.4"
width="385.15"
x="32.55"
y="21.8"
id="rect449" />
</clipPath>
</defs>
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4581"
width="69.618324"
height="10.38168"
x="189.92368"
y="99.969467" />
</svg>
<?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">
<!-- Created with matplotlib (http://matplotlib.org/) -->
<svg height="216pt" version="1.1" viewBox="0 0 432 216" width="432pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<style type="text/css">
*{stroke-linecap:butt;stroke-linejoin:round;}
</style>
</defs>
<g id="figure_1">
<g id="patch_1">
<path d="M 0 216
L 432 216
L 432 0
L 0 0
z
" style="fill:#ffffff;"/>
</g>
<g id="axes_1">
<g id="patch_2">
<path d="M 32.55 188.2
L 417.7 188.2
L 417.7 21.8
L 32.55 21.8
z
" style="fill:#ffffff;"/>
</g>
<g id="matplotlib.axis_1">
<g id="xtick_1">
<g id="line2d_1">
<defs>
<path d="M 0 0
L 0 3.5
" id="mf875541201" style="stroke:#000000;stroke-width:0.8;"/>
</defs>
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="50.056818" xlink:href="#mf875541201" y="188.2"/>
</g>
</g>
<g id="text_1">
<!-- 0.80 -->
<defs>
<path d="M 31.78125 66.40625
Q 24.171875 66.40625 20.328125 58.90625
Q 16.5 51.421875 16.5 36.375
Q 16.5 21.390625 20.328125 13.890625
Q 24.171875 6.390625 31.78125 6.390625
Q 39.453125 6.390625 43.28125 13.890625
Q 47.125 21.390625 47.125 36.375
Q 47.125 51.421875 43.28125 58.90625
Q 39.453125 66.40625 31.78125 66.40625
M 31.78125 74.21875
Q 44.046875 74.21875 50.515625 64.515625
Q 56.984375 54.828125 56.984375 36.375
Q 56.984375 17.96875 50.515625 8.265625
Q 44.046875 -1.421875 31.78125 -1.421875
Q 19.53125 -1.421875 13.0625 8.265625
Q 6.59375 17.96875 6.59375 36.375
Q 6.59375 54.828125 13.0625 64.515625
Q 19.53125 74.21875 31.78125 74.21875
" id="DejaVuSans-30"/>
<path d="M 10.6875 12.40625
L 21 12.40625
L 21 0
L 10.6875 0
z
" id="DejaVuSans-2e"/>
<path d="M 31.78125 34.625
Q 24.75 34.625 20.71875 30.859375
Q 16.703125 27.09375 16.703125 20.515625
Q 16.703125 13.921875 20.71875 10.15625
Q 24.75 6.390625 31.78125 6.390625
Q 38.8125 6.390625 42.859375 10.171875
Q 46.921875 13.96875 46.921875 20.515625
Q 46.921875 27.09375 42.890625 30.859375
Q 38.875 34.625 31.78125 34.625
M 21.921875 38.8125
Q 15.578125 40.375 12.03125 44.71875
Q 8.5 49.078125 8.5 55.328125
Q 8.5 64.0625 14.71875 69.140625
Q 20.953125 74.21875 31.78125 74.21875
Q 42.671875 74.21875 48.875 69.140625
Q 55.078125 64.0625 55.078125 55.328125
Q 55.078125 49.078125 51.53125 44.71875
Q 48 40.375 41.703125 38.8125
Q 48.828125 37.15625 52.796875 32.3125
Q 56.78125 27.484375 56.78125 20.515625
Q 56.78125 9.90625 50.3125 4.234375
Q 43.84375 -1.421875 31.78125 -1.421875
Q 19.734375 -1.421875 13.25 4.234375
Q 6.78125 9.90625 6.78125 20.515625
Q 6.78125 27.484375 10.78125 32.3125
Q 14.796875 37.15625 21.921875 38.8125
M 18.3125 54.390625
Q 18.3125 48.734375 21.84375 45.5625
Q 25.390625 42.390625 31.78125 42.390625
Q 38.140625 42.390625 41.71875 45.5625
Q 45.3125 48.734375 45.3125 54.390625
Q 45.3125 60.0625 41.71875 63.234375
Q 38.140625 66.40625 31.78125 66.40625
Q 25.390625 66.40625 21.84375 63.234375
Q 18.3125 60.0625 18.3125 54.390625
" id="DejaVuSans-38"/>
</defs>
<g transform="translate(38.924006 202.798438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-38"/>
<use x="159.033203" xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
<g id="xtick_2">
<g id="line2d_2">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="93.823864" xlink:href="#mf875541201" y="188.2"/>
</g>
</g>
<g id="text_2">
<!-- 0.85 -->
<defs>
<path d="M 10.796875 72.90625
L 49.515625 72.90625
L 49.515625 64.59375
L 19.828125 64.59375
L 19.828125 46.734375
Q 21.96875 47.46875 24.109375 47.828125
Q 26.265625 48.1875 28.421875 48.1875
Q 40.625 48.1875 47.75 41.5
Q 54.890625 34.8125 54.890625 23.390625
Q 54.890625 11.625 47.5625 5.09375
Q 40.234375 -1.421875 26.90625 -1.421875
Q 22.3125 -1.421875 17.546875 -0.640625
Q 12.796875 0.140625 7.71875 1.703125
L 7.71875 11.625
Q 12.109375 9.234375 16.796875 8.0625
Q 21.484375 6.890625 26.703125 6.890625
Q 35.15625 6.890625 40.078125 11.328125
Q 45.015625 15.765625 45.015625 23.390625
Q 45.015625 31 40.078125 35.4375
Q 35.15625 39.890625 26.703125 39.890625
Q 22.75 39.890625 18.8125 39.015625
Q 14.890625 38.140625 10.796875 36.28125
z
" id="DejaVuSans-35"/>
</defs>
<g transform="translate(82.691051 202.798438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-38"/>
<use x="159.033203" xlink:href="#DejaVuSans-35"/>
</g>
</g>
</g>
<g id="xtick_3">
<g id="line2d_3">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="137.590909" xlink:href="#mf875541201" y="188.2"/>
</g>
</g>
<g id="text_3">
<!-- 0.90 -->
<defs>
<path d="M 10.984375 1.515625
L 10.984375 10.5
Q 14.703125 8.734375 18.5 7.8125
Q 22.3125 6.890625 25.984375 6.890625
Q 35.75 6.890625 40.890625 13.453125
Q 46.046875 20.015625 46.78125 33.40625
Q 43.953125 29.203125 39.59375 26.953125
Q 35.25 24.703125 29.984375 24.703125
Q 19.046875 24.703125 12.671875 31.3125
Q 6.296875 37.9375 6.296875 49.421875
Q 6.296875 60.640625 12.9375 67.421875
Q 19.578125 74.21875 30.609375 74.21875
Q 43.265625 74.21875 49.921875 64.515625
Q 56.59375 54.828125 56.59375 36.375
Q 56.59375 19.140625 48.40625 8.859375
Q 40.234375 -1.421875 26.421875 -1.421875
Q 22.703125 -1.421875 18.890625 -0.6875
Q 15.09375 0.046875 10.984375 1.515625
M 30.609375 32.421875
Q 37.25 32.421875 41.125 36.953125
Q 45.015625 41.5 45.015625 49.421875
Q 45.015625 57.28125 41.125 61.84375
Q 37.25 66.40625 30.609375 66.40625
Q 23.96875 66.40625 20.09375 61.84375
Q 16.21875 57.28125 16.21875 49.421875
Q 16.21875 41.5 20.09375 36.953125
Q 23.96875 32.421875 30.609375 32.421875
" id="DejaVuSans-39"/>
</defs>
<g transform="translate(126.458097 202.798438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-39"/>
<use x="159.033203" xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
<g id="xtick_4">
<g id="line2d_4">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="181.357955" xlink:href="#mf875541201" y="188.2"/>
</g>
</g>
<g id="text_4">
<!-- 0.95 -->
<g transform="translate(170.225142 202.798438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-39"/>
<use x="159.033203" xlink:href="#DejaVuSans-35"/>
</g>
</g>
</g>
<g id="xtick_5">
<g id="line2d_5">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="225.125" xlink:href="#mf875541201" y="188.2"/>
</g>
</g>
<g id="text_5">
<!-- 1.00 -->
<defs>
<path d="M 12.40625 8.296875
L 28.515625 8.296875
L 28.515625 63.921875
L 10.984375 60.40625
L 10.984375 69.390625
L 28.421875 72.90625
L 38.28125 72.90625
L 38.28125 8.296875
L 54.390625 8.296875
L 54.390625 0
L 12.40625 0
z
" id="DejaVuSans-31"/>
</defs>
<g transform="translate(213.992188 202.798438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-31"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-30"/>
<use x="159.033203" xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
<g id="xtick_6">
<g id="line2d_6">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="268.892045" xlink:href="#mf875541201" y="188.2"/>
</g>
</g>
<g id="text_6">
<!-- 1.05 -->
<g transform="translate(257.759233 202.798438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-31"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-30"/>
<use x="159.033203" xlink:href="#DejaVuSans-35"/>
</g>
</g>
</g>
<g id="xtick_7">
<g id="line2d_7">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="312.659091" xlink:href="#mf875541201" y="188.2"/>
</g>
</g>
<g id="text_7">
<!-- 1.10 -->
<g transform="translate(301.526278 202.798438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-31"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-31"/>
<use x="159.033203" xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
<g id="xtick_8">
<g id="line2d_8">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="356.426136" xlink:href="#mf875541201" y="188.2"/>
</g>
</g>
<g id="text_8">
<!-- 1.15 -->
<g transform="translate(345.293324 202.798438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-31"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-31"/>
<use x="159.033203" xlink:href="#DejaVuSans-35"/>
</g>
</g>
</g>
<g id="xtick_9">
<g id="line2d_9">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="400.193182" xlink:href="#mf875541201" y="188.2"/>
</g>
</g>
<g id="text_9">
<!-- 1.20 -->
<defs>
<path d="M 19.1875 8.296875
L 53.609375 8.296875
L 53.609375 0
L 7.328125 0
L 7.328125 8.296875
Q 12.9375 14.109375 22.625 23.890625
Q 32.328125 33.6875 34.8125 36.53125
Q 39.546875 41.84375 41.421875 45.53125
Q 43.3125 49.21875 43.3125 52.78125
Q 43.3125 58.59375 39.234375 62.25
Q 35.15625 65.921875 28.609375 65.921875
Q 23.96875 65.921875 18.8125 64.3125
Q 13.671875 62.703125 7.8125 59.421875
L 7.8125 69.390625
Q 13.765625 71.78125 18.9375 73
Q 24.125 74.21875 28.421875 74.21875
Q 39.75 74.21875 46.484375 68.546875
Q 53.21875 62.890625 53.21875 53.421875
Q 53.21875 48.921875 51.53125 44.890625
Q 49.859375 40.875 45.40625 35.40625
Q 44.1875 33.984375 37.640625 27.21875
Q 31.109375 20.453125 19.1875 8.296875
" id="DejaVuSans-32"/>
</defs>
<g transform="translate(389.060369 202.798438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-31"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-32"/>
<use x="159.033203" xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
</g>
<g id="matplotlib.axis_2">
<g id="ytick_1">
<g id="line2d_10">
<defs>
<path d="M 0 0
L -3.5 0
" id="m87b7e82d4d" style="stroke:#000000;stroke-width:0.8;"/>
</defs>
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="32.55" xlink:href="#m87b7e82d4d" y="164.090909"/>
</g>
</g>
<g id="text_10">
<!-- −4 -->
<defs>
<path d="M 10.59375 35.5
L 73.1875 35.5
L 73.1875 27.203125
L 10.59375 27.203125
z
" id="DejaVuSans-2212"/>
<path d="M 37.796875 64.3125
L 12.890625 25.390625
L 37.796875 25.390625
z
M 35.203125 72.90625
L 47.609375 72.90625
L 47.609375 25.390625
L 58.015625 25.390625
L 58.015625 17.1875
L 47.609375 17.1875
L 47.609375 0
L 37.796875 0
L 37.796875 17.1875
L 4.890625 17.1875
L 4.890625 26.703125
z
" id="DejaVuSans-34"/>
</defs>
<g transform="translate(10.807813 167.890128)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-2212"/>
<use x="83.789062" xlink:href="#DejaVuSans-34"/>
</g>
</g>
</g>
<g id="ytick_2">
<g id="line2d_11">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="32.55" xlink:href="#m87b7e82d4d" y="134.545455"/>
</g>
</g>
<g id="text_11">
<!-- −2 -->
<g transform="translate(10.807813 138.344674)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-2212"/>
<use x="83.789062" xlink:href="#DejaVuSans-32"/>
</g>
</g>
</g>
<g id="ytick_3">
<g id="line2d_12">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="32.55" xlink:href="#m87b7e82d4d" y="105.000001"/>
</g>
</g>
<g id="text_12">
<!-- 0 -->
<g transform="translate(19.1875 108.79922)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
<g id="ytick_4">
<g id="line2d_13">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="32.55" xlink:href="#m87b7e82d4d" y="75.454547"/>
</g>
</g>
<g id="text_13">
<!-- 2 -->
<g transform="translate(19.1875 79.253766)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-32"/>
</g>
</g>
</g>
<g id="ytick_5">
<g id="line2d_14">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="32.55" xlink:href="#m87b7e82d4d" y="45.909093"/>
</g>
</g>
<g id="text_14">
<!-- 4 -->
<g transform="translate(19.1875 49.708312)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-34"/>
</g>
</g>
</g>
<g id="text_15">
<!-- 1e−7 -->
<defs>
<path d="M 56.203125 29.59375
L 56.203125 25.203125
L 14.890625 25.203125
Q 15.484375 15.921875 20.484375 11.0625
Q 25.484375 6.203125 34.421875 6.203125
Q 39.59375 6.203125 44.453125 7.46875
Q 49.3125 8.734375 54.109375 11.28125
L 54.109375 2.78125
Q 49.265625 0.734375 44.1875 -0.34375
Q 39.109375 -1.421875 33.890625 -1.421875
Q 20.796875 -1.421875 13.15625 6.1875
Q 5.515625 13.8125 5.515625 26.8125
Q 5.515625 40.234375 12.765625 48.109375
Q 20.015625 56 32.328125 56
Q 43.359375 56 49.78125 48.890625
Q 56.203125 41.796875 56.203125 29.59375
M 47.21875 32.234375
Q 47.125 39.59375 43.09375 43.984375
Q 39.0625 48.390625 32.421875 48.390625
Q 24.90625 48.390625 20.390625 44.140625
Q 15.875 39.890625 15.1875 32.171875
z
" id="DejaVuSans-65"/>
<path d="M 8.203125 72.90625
L 55.078125 72.90625
L 55.078125 68.703125
L 28.609375 0
L 18.3125 0
L 43.21875 64.59375
L 8.203125 64.59375
z
" id="DejaVuSans-37"/>
</defs>
<g transform="translate(32.55 18.8)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-31"/>
<use x="63.623047" xlink:href="#DejaVuSans-65"/>
<use x="125.146484" xlink:href="#DejaVuSans-2212"/>
<use x="208.935547" xlink:href="#DejaVuSans-37"/>
</g>
</g>
</g>
<g id="line2d_15">
<path clip-path="url(#p7ec0e234b8)" d="M 50.056818 180.636364
L 53.593549 167.944747
L 57.13028 157.182673
L 60.667011 148.088405
L 64.203742 140.431246
L 67.740473 134.008412
L 71.277204 128.64216
L 74.813935 124.177157
L 78.350666 120.478066
L 81.887397 117.427366
L 85.424128 114.923337
L 88.960859 112.878262
L 92.49759 111.21678
L 96.03432 109.874383
L 99.571051 108.796114
L 103.107782 107.935324
L 106.644513 107.252616
L 110.181244 106.714883
L 113.717975 106.294433
L 117.254706 105.968237
L 120.791437 105.717268
L 124.328168 105.525882
L 127.864899 105.381309
L 131.40163 105.273213
L 134.938361 105.193264
L 138.475092 105.134829
L 142.011823 105.09266
L 145.548554 105.062653
L 149.085285 105.041612
L 152.622016 105.027108
L 156.158747 105.017283
L 159.695478 105.010761
L 163.232208 105.00653
L 166.768939 105.003846
L 170.30567 105.002192
L 173.842401 105.001202
L 177.379132 105.000633
L 180.915863 105.000314
L 184.452594 105.000152
L 187.989325 105.000065
L 191.526056 105.000029
L 195.062787 105.000009
L 198.599518 105.000006
L 202.136249 105.000002
L 205.67298 105.000003
L 209.209711 104.999999
L 212.746442 105.000002
L 216.283173 105
L 219.819904 105.000004
L 223.356635 105.000002
L 226.893365 105.000005
L 230.430096 105
L 233.966827 104.999997
L 237.503558 104.999998
L 241.040289 105.000006
L 244.57702 105.000007
L 248.113751 105.000003
L 251.650482 105
L 255.187213 104.999991
L 258.723944 104.999977
L 262.260675 104.999935
L 265.797406 104.999852
L 269.334137 104.99969
L 272.870868 104.99937
L 276.407599 104.998802
L 279.94433 104.997812
L 283.481061 104.996159
L 287.017792 104.993479
L 290.554522 104.989242
L 294.091253 104.982721
L 297.627984 104.972894
L 301.164715 104.958388
L 304.701446 104.937353
L 308.238177 104.907339
L 311.774908 104.865178
L 315.311639 104.80674
L 318.84837 104.726795
L 322.385101 104.618684
L 325.921832 104.474124
L 329.458563 104.28273
L 332.995294 104.03176
L 336.532025 103.705571
L 340.068756 103.285113
L 343.605487 102.747385
L 347.142218 102.064678
L 350.678949 101.20389
L 354.21568 100.125624
L 357.75241 98.783223
L 361.289141 97.121739
L 364.825872 95.076667
L 368.362603 92.57264
L 371.899334 89.521931
L 375.436065 85.822847
L 378.972796 81.35784
L 382.509527 75.991594
L 386.046258 69.568752
L 389.582989 61.911599
L 393.11972 52.81731
L 396.656451 42.055256
L 400.193182 29.363637
" style="fill:none;stroke:#1f77b4;stroke-linecap:square;stroke-width:1.5;"/>
</g>
<g id="line2d_16">
<path clip-path="url(#p7ec0e234b8)" d="M 50.056818 180.636363
L 53.593549 167.944748
L 57.13028 157.182676
L 60.667011 148.088406
L 64.203742 140.431246
L 67.740473 134.008413
L 71.277204 128.642162
L 74.813935 124.177157
L 78.350666 120.478067
L 81.887397 117.427365
L 85.424128 114.923337
L 88.960859 112.878262
L 92.49759 111.216777
L 96.03432 109.874384
L 99.571051 108.796113
L 103.107782 107.935322
L 106.644513 107.252617
L 110.181244 106.714883
L 113.717975 106.294432
L 117.254706 105.968239
L 120.791437 105.717269
L 124.328168 105.525882
L 127.864899 105.38131
L 131.40163 105.27321
L 134.938361 105.193262
L 138.475092 105.134829
L 142.011823 105.092661
L 145.548554 105.062651
L 149.085285 105.041615
L 152.622016 105.027106
L 156.158747 105.017283
L 159.695478 105.01076
L 163.232208 105.006527
L 166.768939 105.003844
L 170.30567 105.00219
L 173.842401 105.001202
L 177.379132 105.000633
L 180.915863 105.000317
L 184.452594 105.000149
L 187.989325 105.000067
L 191.526056 105.000029
L 195.062787 105.000012
L 198.599518 105.000005
L 202.136249 105.000002
L 205.67298 105.000001
L 209.209711 105
L 212.746442 105.000001
L 216.283173 105
L 219.819904 105
L 223.356635 105.000002
L 226.893365 105
L 230.430096 105.000001
L 233.966827 105.000001
L 237.503558 105.000002
L 241.040289 104.999999
L 244.57702 104.999999
L 248.113751 105
L 251.650482 104.999997
L 255.187213 104.999991
L 258.723944 104.999973
L 262.260675 104.999934
L 265.797406 104.999851
L 269.334137 104.999685
L 272.870868 104.999371
L 276.407599 104.998799
L 279.94433 104.997812
L 283.481061 104.996158
L 287.017792 104.993475
L 290.554522 104.989243
L 294.091253 104.982719
L 297.627984 104.972894
L 301.164715 104.958389
L 304.701446 104.937351
L 308.238177 104.90734
L 311.774908 104.865174
L 315.311639 104.806737
L 318.84837 104.726793
L 322.385101 104.618693
L 325.921832 104.474119
L 329.458563 104.28273
L 332.995294 104.03176
L 336.532025 103.705573
L 340.068756 103.285117
L 343.605487 102.747384
L 347.142218 102.064682
L 350.678949 101.203887
L 354.21568 100.125621
L 357.75241 98.783227
L 361.289141 97.121736
L 364.825872 95.076666
L 368.362603 92.572639
L 371.899334 89.521933
L 375.436065 85.822843
L 378.972796 81.357841
L 382.509527 75.991589
L 386.046258 69.568759
L 389.582989 61.911596
L 393.11972 52.817328
L 396.656451 42.055256
L 400.193182 29.363636
" style="fill:none;stroke:#ff7f0e;stroke-linecap:square;stroke-width:1.5;"/>
</g>
<g id="line2d_17">
<path clip-path="url(#p7ec0e234b8)" d="M 50.056818 180.636363
L 53.593549 167.944748
L 57.13028 157.182675
L 60.667011 148.088406
L 64.203742 140.431246
L 67.740473 134.008412
L 71.277204 128.642161
L 74.813935 124.177158
L 78.350666 120.478068
L 81.887397 117.427366
L 85.424128 114.923337
L 88.960859 112.878263
L 92.49759 111.216777
L 96.03432 109.874384
L 99.571051 108.796113
L 103.107782 107.935323
L 106.644513 107.252617
L 110.181244 106.714882
L 113.717975 106.294432
L 117.254706 105.96824
L 120.791437 105.71727
L 124.328168 105.525882
L 127.864899 105.381311
L 131.40163 105.273211
L 134.938361 105.193263
L 138.475092 105.134828
L 142.011823 105.092661
L 145.548554 105.062652
L 149.085285 105.041614
L 152.622016 105.027107
L 156.158747 105.017283
L 159.695478 105.010761
L 163.232208 105.006527
L 166.768939 105.003844
L 170.30567 105.00219
L 173.842401 105.001202
L 177.379132 105.000632
L 180.915863 105.000317
L 184.452594 105.00015
L 187.989325 105.000067
L 191.526056 105.000028
L 195.062787 105.000011
L 198.599518 105.000004
L 202.136249 105.000002
L 205.67298 105.000001
L 209.209711 105.000001
L 212.746442 105.000001
L 216.283173 105.000001
L 219.819904 105.000001
L 223.356635 105.000001
L 226.893365 105.000001
L 230.430096 105.000001
L 233.966827 105.000001
L 237.503558 105.000001
L 241.040289 105.000001
L 244.57702 105.000001
L 248.113751 105
L 251.650482 104.999998
L 255.187213 104.999991
L 258.723944 104.999974
L 262.260675 104.999935
L 265.797406 104.999852
L 269.334137 104.999685
L 272.870868 104.99937
L 276.407599 104.9988
L 279.94433 104.997812
L 283.481061 104.996158
L 287.017792 104.993475
L 290.554522 104.989241
L 294.091253 104.982719
L 297.627984 104.972895
L 301.164715 104.958388
L 304.701446 104.93735
L 308.238177 104.90734
L 311.774908 104.865173
L 315.311639 104.806739
L 318.84837 104.726791
L 322.385101 104.618691
L 325.921832 104.47412
L 329.458563 104.282732
L 332.995294 104.031762
L 336.532025 103.70557
L 340.068756 103.28512
L 343.605487 102.747385
L 347.142218 102.064679
L 350.678949 101.203889
L 354.21568 100.125618
L 357.75241 98.783224
L 361.289141 97.121739
L 364.825872 95.076665
L 368.362603 92.572636
L 371.899334 89.521934
L 375.436065 85.822844
L 378.972796 81.357841
L 382.509527 75.99159
L 386.046258 69.568756
L 389.582989 61.911596
L 393.11972 52.817327
L 396.656451 42.055254
L 400.193182 29.363639
" style="fill:none;stroke:#2ca02c;stroke-linecap:square;stroke-width:1.5;"/>
</g>
<g id="patch_3">
<path d="M 32.55 188.2
L 32.55 21.8
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_4">
<path d="M 417.7 188.2
L 417.7 21.8
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_5">
<path d="M 32.55 188.2
L 417.7 188.2
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_6">
<path d="M 32.55 21.8
L 417.7 21.8
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="legend_1">
<g id="patch_7">
<path d="M 39.55 183.2
L 249.990625 183.2
Q 251.990625 183.2 251.990625 181.2
L 251.990625 136.965625
Q 251.990625 134.965625 249.990625 134.965625
L 39.55 134.965625
Q 37.55 134.965625 37.55 136.965625
L 37.55 181.2
Q 37.55 183.2 39.55 183.2
z
" style="fill:#ffffff;opacity:0.8;stroke:#cccccc;stroke-linejoin:miter;"/>
</g>
<g id="line2d_18">
<path d="M 41.55 143.464063
L 61.55 143.464063
" style="fill:none;stroke:#1f77b4;stroke-linecap:square;stroke-width:1.5;"/>
</g>
<g id="line2d_19"/>
<g id="text_16">
<!-- polynôme -->
<defs>
<path d="M 18.109375 8.203125
L 18.109375 -20.796875
L 9.078125 -20.796875
L 9.078125 54.6875
L 18.109375 54.6875
L 18.109375 46.390625
Q 20.953125 51.265625 25.265625 53.625
Q 29.59375 56 35.59375 56
Q 45.5625 56 51.78125 48.09375
Q 58.015625 40.1875 58.015625 27.296875
Q 58.015625 14.40625 51.78125 6.484375
Q 45.5625 -1.421875 35.59375 -1.421875
Q 29.59375 -1.421875 25.265625 0.953125
Q 20.953125 3.328125 18.109375 8.203125
M 48.6875 27.296875
Q 48.6875 37.203125 44.609375 42.84375
Q 40.53125 48.484375 33.40625 48.484375
Q 26.265625 48.484375 22.1875 42.84375
Q 18.109375 37.203125 18.109375 27.296875
Q 18.109375 17.390625 22.1875 11.75
Q 26.265625 6.109375 33.40625 6.109375
Q 40.53125 6.109375 44.609375 11.75
Q 48.6875 17.390625 48.6875 27.296875
" id="DejaVuSans-70"/>
<path d="M 30.609375 48.390625
Q 23.390625 48.390625 19.1875 42.75
Q 14.984375 37.109375 14.984375 27.296875
Q 14.984375 17.484375 19.15625 11.84375
Q 23.34375 6.203125 30.609375 6.203125
Q 37.796875 6.203125 41.984375 11.859375
Q 46.1875 17.53125 46.1875 27.296875
Q 46.1875 37.015625 41.984375 42.703125
Q 37.796875 48.390625 30.609375 48.390625
M 30.609375 56
Q 42.328125 56 49.015625 48.375
Q 55.71875 40.765625 55.71875 27.296875
Q 55.71875 13.875 49.015625 6.21875
Q 42.328125 -1.421875 30.609375 -1.421875
Q 18.84375 -1.421875 12.171875 6.21875
Q 5.515625 13.875 5.515625 27.296875
Q 5.515625 40.765625 12.171875 48.375
Q 18.84375 56 30.609375 56
" id="DejaVuSans-6f"/>
<path d="M 9.421875 75.984375
L 18.40625 75.984375
L 18.40625 0
L 9.421875 0
z
" id="DejaVuSans-6c"/>
<path d="M 32.171875 -5.078125
Q 28.375 -14.84375 24.75 -17.8125
Q 21.140625 -20.796875 15.09375 -20.796875
L 7.90625 -20.796875
L 7.90625 -13.28125
L 13.1875 -13.28125
Q 16.890625 -13.28125 18.9375 -11.515625
Q 21 -9.765625 23.484375 -3.21875
L 25.09375 0.875
L 2.984375 54.6875
L 12.5 54.6875
L 29.59375 11.921875
L 46.6875 54.6875
L 56.203125 54.6875
z
" id="DejaVuSans-79"/>
<path d="M 54.890625 33.015625
L 54.890625 0
L 45.90625 0
L 45.90625 32.71875
Q 45.90625 40.484375 42.875 44.328125
Q 39.84375 48.1875 33.796875 48.1875
Q 26.515625 48.1875 22.3125 43.546875
Q 18.109375 38.921875 18.109375 30.90625
L 18.109375 0
L 9.078125 0
L 9.078125 54.6875
L 18.109375 54.6875
L 18.109375 46.1875
Q 21.34375 51.125 25.703125 53.5625
Q 30.078125 56 35.796875 56
Q 45.21875 56 50.046875 50.171875
Q 54.890625 44.34375 54.890625 33.015625
" id="DejaVuSans-6e"/>
<path d="M 30.609375 48.390625
Q 23.390625 48.390625 19.1875 42.75
Q 14.984375 37.109375 14.984375 27.296875
Q 14.984375 17.484375 19.15625 11.84375
Q 23.34375 6.203125 30.609375 6.203125
Q 37.796875 6.203125 41.984375 11.859375
Q 46.1875 17.53125 46.1875 27.296875
Q 46.1875 37.015625 41.984375 42.703125
Q 37.796875 48.390625 30.609375 48.390625
M 30.609375 56
Q 42.328125 56 49.015625 48.375
Q 55.71875 40.765625 55.71875 27.296875
Q 55.71875 13.875 49.015625 6.21875
Q 42.328125 -1.421875 30.609375 -1.421875
Q 18.84375 -1.421875 12.171875 6.21875
Q 5.515625 13.875 5.515625 27.296875
Q 5.515625 40.765625 12.171875 48.375
Q 18.84375 56 30.609375 56
M 27.015625 79.984375
L 34.234375 79.984375
L 46.203125 61.625
L 39.421875 61.625
L 30.625 73.578125
L 21.84375 61.625
L 15.046875 61.625
z
" id="DejaVuSans-f4"/>
<path d="M 52 44.1875
Q 55.375 50.25 60.0625 53.125
Q 64.75 56 71.09375 56
Q 79.640625 56 84.28125 50.015625
Q 88.921875 44.046875 88.921875 33.015625
L 88.921875 0
L 79.890625 0
L 79.890625 32.71875
Q 79.890625 40.578125 77.09375 44.375
Q 74.3125 48.1875 68.609375 48.1875
Q 61.625 48.1875 57.5625 43.546875
Q 53.515625 38.921875 53.515625 30.90625
L 53.515625 0
L 44.484375 0
L 44.484375 32.71875
Q 44.484375 40.625 41.703125 44.40625
Q 38.921875 48.1875 33.109375 48.1875
Q 26.21875 48.1875 22.15625 43.53125
Q 18.109375 38.875 18.109375 30.90625
L 18.109375 0
L 9.078125 0
L 9.078125 54.6875
L 18.109375 54.6875
L 18.109375 46.1875
Q 21.1875 51.21875 25.484375 53.609375
Q 29.78125 56 35.6875 56
Q 41.65625 56 45.828125 52.96875
Q 50 49.953125 52 44.1875
" id="DejaVuSans-6d"/>
</defs>
<g transform="translate(69.55 146.964063)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-70"/>
<use x="63.476562" xlink:href="#DejaVuSans-6f"/>
<use x="124.658203" xlink:href="#DejaVuSans-6c"/>
<use x="152.441406" xlink:href="#DejaVuSans-79"/>
<use x="211.621094" xlink:href="#DejaVuSans-6e"/>
<use x="275" xlink:href="#DejaVuSans-f4"/>
<use x="336.181641" xlink:href="#DejaVuSans-6d"/>
<use x="433.59375" xlink:href="#DejaVuSans-65"/>
</g>
</g>
<g id="line2d_20">
<path d="M 41.55 158.542188
L 61.55 158.542188
" style="fill:none;stroke:#ff7f0e;stroke-linecap:square;stroke-width:1.5;"/>
</g>
<g id="line2d_21"/>
<g id="text_17">
<!-- recalculé par la méthode de Horner -->
<defs>
<path d="M 41.109375 46.296875
Q 39.59375 47.171875 37.8125 47.578125
Q 36.03125 48 33.890625 48
Q 26.265625 48 22.1875 43.046875
Q 18.109375 38.09375 18.109375 28.8125
L 18.109375 0
L 9.078125 0
L 9.078125 54.6875
L 18.109375 54.6875
L 18.109375 46.1875
Q 20.953125 51.171875 25.484375 53.578125
Q 30.03125 56 36.53125 56
Q 37.453125 56 38.578125 55.875
Q 39.703125 55.765625 41.0625 55.515625
z
" id="DejaVuSans-72"/>
<path d="M 48.78125 52.59375
L 48.78125 44.1875
Q 44.96875 46.296875 41.140625 47.34375
Q 37.3125 48.390625 33.40625 48.390625
Q 24.65625 48.390625 19.8125 42.84375
Q 14.984375 37.3125 14.984375 27.296875
Q 14.984375 17.28125 19.8125 11.734375
Q 24.65625 6.203125 33.40625 6.203125
Q 37.3125 6.203125 41.140625 7.25
Q 44.96875 8.296875 48.78125 10.40625
L 48.78125 2.09375
Q 45.015625 0.34375 40.984375 -0.53125
Q 36.96875 -1.421875 32.421875 -1.421875
Q 20.0625 -1.421875 12.78125 6.34375
Q 5.515625 14.109375 5.515625 27.296875
Q 5.515625 40.671875 12.859375 48.328125
Q 20.21875 56 33.015625 56
Q 37.15625 56 41.109375 55.140625
Q 45.0625 54.296875 48.78125 52.59375
" id="DejaVuSans-63"/>
<path d="M 34.28125 27.484375
Q 23.390625 27.484375 19.1875 25
Q 14.984375 22.515625 14.984375 16.5
Q 14.984375 11.71875 18.140625 8.90625
Q 21.296875 6.109375 26.703125 6.109375
Q 34.1875 6.109375 38.703125 11.40625
Q 43.21875 16.703125 43.21875 25.484375
L 43.21875 27.484375
z
M 52.203125 31.203125
L 52.203125 0
L 43.21875 0
L 43.21875 8.296875
Q 40.140625 3.328125 35.546875 0.953125
Q 30.953125 -1.421875 24.3125 -1.421875
Q 15.921875 -1.421875 10.953125 3.296875
Q 6 8.015625 6 15.921875
Q 6 25.140625 12.171875 29.828125
Q 18.359375 34.515625 30.609375 34.515625
L 43.21875 34.515625
L 43.21875 35.40625
Q 43.21875 41.609375 39.140625 45
Q 35.0625 48.390625 27.6875 48.390625
Q 23 48.390625 18.546875 47.265625
Q 14.109375 46.140625 10.015625 43.890625
L 10.015625 52.203125
Q 14.9375 54.109375 19.578125 55.046875
Q 24.21875 56 28.609375 56
Q 40.484375 56 46.34375 49.84375
Q 52.203125 43.703125 52.203125 31.203125
" id="DejaVuSans-61"/>
<path d="M 8.5 21.578125
L 8.5 54.6875
L 17.484375 54.6875
L 17.484375 21.921875
Q 17.484375 14.15625 20.5 10.265625
Q 23.53125 6.390625 29.59375 6.390625
Q 36.859375 6.390625 41.078125 11.03125
Q 45.3125 15.671875 45.3125 23.6875
L 45.3125 54.6875
L 54.296875 54.6875
L 54.296875 0
L 45.3125 0
L 45.3125 8.40625
Q 42.046875 3.421875 37.71875 1
Q 33.40625 -1.421875 27.6875 -1.421875
Q 18.265625 -1.421875 13.375 4.4375
Q 8.5 10.296875 8.5 21.578125
M 31.109375 56
z
" id="DejaVuSans-75"/>
<path d="M 56.203125 29.59375
L 56.203125 25.203125
L 14.890625 25.203125
Q 15.484375 15.921875 20.484375 11.0625
Q 25.484375 6.203125 34.421875 6.203125
Q 39.59375 6.203125 44.453125 7.46875
Q 49.3125 8.734375 54.109375 11.28125
L 54.109375 2.78125
Q 49.265625 0.734375 44.1875 -0.34375
Q 39.109375 -1.421875 33.890625 -1.421875
Q 20.796875 -1.421875 13.15625 6.1875
Q 5.515625 13.8125 5.515625 26.8125
Q 5.515625 40.234375 12.765625 48.109375
Q 20.015625 56 32.328125 56
Q 43.359375 56 49.78125 48.890625
Q 56.203125 41.796875 56.203125 29.59375
M 47.21875 32.234375
Q 47.125 39.59375 43.09375 43.984375
Q 39.0625 48.390625 32.421875 48.390625
Q 24.90625 48.390625 20.390625 44.140625
Q 15.875 39.890625 15.1875 32.171875
z
M 38.53125 79.984375
L 48.25 79.984375
L 32.34375 61.625
L 24.859375 61.625
z
" id="DejaVuSans-e9"/>
<path id="DejaVuSans-20"/>
<path d="M 18.3125 70.21875
L 18.3125 54.6875
L 36.8125 54.6875
L 36.8125 47.703125
L 18.3125 47.703125
L 18.3125 18.015625
Q 18.3125 11.328125 20.140625 9.421875
Q 21.96875 7.515625 27.59375 7.515625
L 36.8125 7.515625
L 36.8125 0
L 27.59375 0
Q 17.1875 0 13.234375 3.875
Q 9.28125 7.765625 9.28125 18.015625
L 9.28125 47.703125
L 2.6875 47.703125
L 2.6875 54.6875
L 9.28125 54.6875
L 9.28125 70.21875
z
" id="DejaVuSans-74"/>
<path d="M 54.890625 33.015625
L 54.890625 0
L 45.90625 0
L 45.90625 32.71875
Q 45.90625 40.484375 42.875 44.328125
Q 39.84375 48.1875 33.796875 48.1875
Q 26.515625 48.1875 22.3125 43.546875
Q 18.109375 38.921875 18.109375 30.90625
L 18.109375 0
L 9.078125 0
L 9.078125 75.984375
L 18.109375 75.984375
L 18.109375 46.1875
Q 21.34375 51.125 25.703125 53.5625
Q 30.078125 56 35.796875 56
Q 45.21875 56 50.046875 50.171875
Q 54.890625 44.34375 54.890625 33.015625
" id="DejaVuSans-68"/>
<path d="M 45.40625 46.390625
L 45.40625 75.984375
L 54.390625 75.984375
L 54.390625 0
L 45.40625 0
L 45.40625 8.203125
Q 42.578125 3.328125 38.25 0.953125
Q 33.9375 -1.421875 27.875 -1.421875
Q 17.96875 -1.421875 11.734375 6.484375
Q 5.515625 14.40625 5.515625 27.296875
Q 5.515625 40.1875 11.734375 48.09375
Q 17.96875 56 27.875 56
Q 33.9375 56 38.25 53.625
Q 42.578125 51.265625 45.40625 46.390625
M 14.796875 27.296875
Q 14.796875 17.390625 18.875 11.75
Q 22.953125 6.109375 30.078125 6.109375
Q 37.203125 6.109375 41.296875 11.75
Q 45.40625 17.390625 45.40625 27.296875
Q 45.40625 37.203125 41.296875 42.84375
Q 37.203125 48.484375 30.078125 48.484375
Q 22.953125 48.484375 18.875 42.84375
Q 14.796875 37.203125 14.796875 27.296875
" id="DejaVuSans-64"/>
<path d="M 9.8125 72.90625
L 19.671875 72.90625
L 19.671875 43.015625
L 55.515625 43.015625
L 55.515625 72.90625
L 65.375 72.90625
L 65.375 0
L 55.515625 0
L 55.515625 34.71875
L 19.671875 34.71875
L 19.671875 0
L 9.8125 0
z
" id="DejaVuSans-48"/>
</defs>
<g transform="translate(69.55 162.042188)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-72"/>
<use x="41.082031" xlink:href="#DejaVuSans-65"/>
<use x="102.605469" xlink:href="#DejaVuSans-63"/>
<use x="157.585938" xlink:href="#DejaVuSans-61"/>
<use x="218.865234" xlink:href="#DejaVuSans-6c"/>
<use x="246.648438" xlink:href="#DejaVuSans-63"/>
<use x="301.628906" xlink:href="#DejaVuSans-75"/>
<use x="365.007812" xlink:href="#DejaVuSans-6c"/>
<use x="392.791016" xlink:href="#DejaVuSans-e9"/>
<use x="454.314453" xlink:href="#DejaVuSans-20"/>
<use x="486.101562" xlink:href="#DejaVuSans-70"/>
<use x="549.578125" xlink:href="#DejaVuSans-61"/>
<use x="610.857422" xlink:href="#DejaVuSans-72"/>
<use x="651.970703" xlink:href="#DejaVuSans-20"/>
<use x="683.757812" xlink:href="#DejaVuSans-6c"/>
<use x="711.541016" xlink:href="#DejaVuSans-61"/>
<use x="772.820312" xlink:href="#DejaVuSans-20"/>
<use x="804.607422" xlink:href="#DejaVuSans-6d"/>
<use x="902.019531" xlink:href="#DejaVuSans-e9"/>
<use x="963.542969" xlink:href="#DejaVuSans-74"/>
<use x="1002.751953" xlink:href="#DejaVuSans-68"/>
<use x="1066.130859" xlink:href="#DejaVuSans-6f"/>
<use x="1127.3125" xlink:href="#DejaVuSans-64"/>
<use x="1190.789062" xlink:href="#DejaVuSans-65"/>
<use x="1252.3125" xlink:href="#DejaVuSans-20"/>
<use x="1284.099609" xlink:href="#DejaVuSans-64"/>
<use x="1347.576172" xlink:href="#DejaVuSans-65"/>
<use x="1409.099609" xlink:href="#DejaVuSans-20"/>
<use x="1440.886719" xlink:href="#DejaVuSans-48"/>
<use x="1516.082031" xlink:href="#DejaVuSans-6f"/>
<use x="1577.263672" xlink:href="#DejaVuSans-72"/>
<use x="1618.361328" xlink:href="#DejaVuSans-6e"/>
<use x="1681.740234" xlink:href="#DejaVuSans-65"/>
<use x="1743.263672" xlink:href="#DejaVuSans-72"/>
</g>
</g>
<g id="line2d_22">
<path d="M 41.55 173.620313
L 61.55 173.620313
" style="fill:none;stroke:#2ca02c;stroke-linecap:square;stroke-width:1.5;"/>
</g>
<g id="line2d_23"/>
<g id="text_18">
<!-- simplifié -->
<defs>
<path d="M 44.28125 53.078125
L 44.28125 44.578125
Q 40.484375 46.53125 36.375 47.5
Q 32.28125 48.484375 27.875 48.484375
Q 21.1875 48.484375 17.84375 46.4375
Q 14.5 44.390625 14.5 40.28125
Q 14.5 37.15625 16.890625 35.375
Q 19.28125 33.59375 26.515625 31.984375
L 29.59375 31.296875
Q 39.15625 29.25 43.1875 25.515625
Q 47.21875 21.78125 47.21875 15.09375
Q 47.21875 7.46875 41.1875 3.015625
Q 35.15625 -1.421875 24.609375 -1.421875
Q 20.21875 -1.421875 15.453125 -0.5625
Q 10.6875 0.296875 5.421875 2
L 5.421875 11.28125
Q 10.40625 8.6875 15.234375 7.390625
Q 20.0625 6.109375 24.8125 6.109375
Q 31.15625 6.109375 34.5625 8.28125
Q 37.984375 10.453125 37.984375 14.40625
Q 37.984375 18.0625 35.515625 20.015625
Q 33.0625 21.96875 24.703125 23.78125
L 21.578125 24.515625
Q 13.234375 26.265625 9.515625 29.90625
Q 5.8125 33.546875 5.8125 39.890625
Q 5.8125 47.609375 11.28125 51.796875
Q 16.75 56 26.8125 56
Q 31.78125 56 36.171875 55.265625
Q 40.578125 54.546875 44.28125 53.078125
" id="DejaVuSans-73"/>
<path d="M 9.421875 54.6875
L 18.40625 54.6875
L 18.40625 0
L 9.421875 0
z
M 9.421875 75.984375
L 18.40625 75.984375
L 18.40625 64.59375
L 9.421875 64.59375
z
" id="DejaVuSans-69"/>
<path d="M 37.109375 75.984375
L 37.109375 68.5
L 28.515625 68.5
Q 23.6875 68.5 21.796875 66.546875
Q 19.921875 64.59375 19.921875 59.515625
L 19.921875 54.6875
L 34.71875 54.6875
L 34.71875 47.703125
L 19.921875 47.703125
L 19.921875 0
L 10.890625 0
L 10.890625 47.703125
L 2.296875 47.703125
L 2.296875 54.6875
L 10.890625 54.6875
L 10.890625 58.5
Q 10.890625 67.625 15.140625 71.796875
Q 19.390625 75.984375 28.609375 75.984375
z
" id="DejaVuSans-66"/>
</defs>
<g transform="translate(69.55 177.120313)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-73"/>
<use x="52.099609" xlink:href="#DejaVuSans-69"/>
<use x="79.882812" xlink:href="#DejaVuSans-6d"/>
<use x="177.294922" xlink:href="#DejaVuSans-70"/>
<use x="240.771484" xlink:href="#DejaVuSans-6c"/>
<use x="268.554688" xlink:href="#DejaVuSans-69"/>
<use x="296.337891" xlink:href="#DejaVuSans-66"/>
<use x="331.542969" xlink:href="#DejaVuSans-69"/>
<use x="359.326172" xlink:href="#DejaVuSans-e9"/>
</g>
</g>
</g>
</g>
</g>
<defs>
<clipPath id="p7ec0e234b8">
<rect height="166.4" width="385.15" x="32.55" y="21.8"/>
</clipPath>
</defs>
</svg>
<?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">
<!-- Created with matplotlib (http://matplotlib.org/) -->
<svg height="216pt" version="1.1" viewBox="0 0 432 216" width="432pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<style type="text/css">
*{stroke-linecap:butt;stroke-linejoin:round;}
</style>
</defs>
<g id="figure_1">
<g id="patch_1">
<path d="M 0 216
L 432 216
L 432 0
L 0 0
z
" style="fill:#ffffff;"/>
</g>
<g id="axes_1">
<g id="patch_2">
<path d="M 48.55 188.2
L 417.7 188.2
L 417.7 21.8
L 48.55 21.8
z
" style="fill:#ffffff;"/>
</g>
<g id="matplotlib.axis_1">
<g id="xtick_1">
<g id="line2d_1">
<defs>
<path d="M 0 0
L 0 3.5
" id="mc4218d1ff0" style="stroke:#000000;stroke-width:0.8;"/>
</defs>
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="89.300325" xlink:href="#mc4218d1ff0" y="188.2"/>
</g>
</g>
<g id="text_1">
<!-- 0.97 -->
<defs>
<path d="M 31.78125 66.40625
Q 24.171875 66.40625 20.328125 58.90625
Q 16.5 51.421875 16.5 36.375
Q 16.5 21.390625 20.328125 13.890625
Q 24.171875 6.390625 31.78125 6.390625
Q 39.453125 6.390625 43.28125 13.890625
Q 47.125 21.390625 47.125 36.375
Q 47.125 51.421875 43.28125 58.90625
Q 39.453125 66.40625 31.78125 66.40625
M 31.78125 74.21875
Q 44.046875 74.21875 50.515625 64.515625
Q 56.984375 54.828125 56.984375 36.375
Q 56.984375 17.96875 50.515625 8.265625
Q 44.046875 -1.421875 31.78125 -1.421875
Q 19.53125 -1.421875 13.0625 8.265625
Q 6.59375 17.96875 6.59375 36.375
Q 6.59375 54.828125 13.0625 64.515625
Q 19.53125 74.21875 31.78125 74.21875
" id="DejaVuSans-30"/>
<path d="M 10.6875 12.40625
L 21 12.40625
L 21 0
L 10.6875 0
z
" id="DejaVuSans-2e"/>
<path d="M 10.984375 1.515625
L 10.984375 10.5
Q 14.703125 8.734375 18.5 7.8125
Q 22.3125 6.890625 25.984375 6.890625
Q 35.75 6.890625 40.890625 13.453125
Q 46.046875 20.015625 46.78125 33.40625
Q 43.953125 29.203125 39.59375 26.953125
Q 35.25 24.703125 29.984375 24.703125
Q 19.046875 24.703125 12.671875 31.3125
Q 6.296875 37.9375 6.296875 49.421875
Q 6.296875 60.640625 12.9375 67.421875
Q 19.578125 74.21875 30.609375 74.21875
Q 43.265625 74.21875 49.921875 64.515625
Q 56.59375 54.828125 56.59375 36.375
Q 56.59375 19.140625 48.40625 8.859375
Q 40.234375 -1.421875 26.421875 -1.421875
Q 22.703125 -1.421875 18.890625 -0.6875
Q 15.09375 0.046875 10.984375 1.515625
M 30.609375 32.421875
Q 37.25 32.421875 41.125 36.953125
Q 45.015625 41.5 45.015625 49.421875
Q 45.015625 57.28125 41.125 61.84375
Q 37.25 66.40625 30.609375 66.40625
Q 23.96875 66.40625 20.09375 61.84375
Q 16.21875 57.28125 16.21875 49.421875
Q 16.21875 41.5 20.09375 36.953125
Q 23.96875 32.421875 30.609375 32.421875
" id="DejaVuSans-39"/>
<path d="M 8.203125 72.90625
L 55.078125 72.90625
L 55.078125 68.703125
L 28.609375 0
L 18.3125 0
L 43.21875 64.59375
L 8.203125 64.59375
z
" id="DejaVuSans-37"/>
</defs>
<g transform="translate(78.167512 202.798438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-39"/>
<use x="159.033203" xlink:href="#DejaVuSans-37"/>
</g>
</g>
</g>
<g id="xtick_2">
<g id="line2d_2">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="137.241883" xlink:href="#mc4218d1ff0" y="188.2"/>
</g>
</g>
<g id="text_2">
<!-- 0.98 -->
<defs>
<path d="M 31.78125 34.625
Q 24.75 34.625 20.71875 30.859375
Q 16.703125 27.09375 16.703125 20.515625
Q 16.703125 13.921875 20.71875 10.15625
Q 24.75 6.390625 31.78125 6.390625
Q 38.8125 6.390625 42.859375 10.171875
Q 46.921875 13.96875 46.921875 20.515625
Q 46.921875 27.09375 42.890625 30.859375
Q 38.875 34.625 31.78125 34.625
M 21.921875 38.8125
Q 15.578125 40.375 12.03125 44.71875
Q 8.5 49.078125 8.5 55.328125
Q 8.5 64.0625 14.71875 69.140625
Q 20.953125 74.21875 31.78125 74.21875
Q 42.671875 74.21875 48.875 69.140625
Q 55.078125 64.0625 55.078125 55.328125
Q 55.078125 49.078125 51.53125 44.71875
Q 48 40.375 41.703125 38.8125
Q 48.828125 37.15625 52.796875 32.3125
Q 56.78125 27.484375 56.78125 20.515625
Q 56.78125 9.90625 50.3125 4.234375
Q 43.84375 -1.421875 31.78125 -1.421875
Q 19.734375 -1.421875 13.25 4.234375
Q 6.78125 9.90625 6.78125 20.515625
Q 6.78125 27.484375 10.78125 32.3125
Q 14.796875 37.15625 21.921875 38.8125
M 18.3125 54.390625
Q 18.3125 48.734375 21.84375 45.5625
Q 25.390625 42.390625 31.78125 42.390625
Q 38.140625 42.390625 41.71875 45.5625
Q 45.3125 48.734375 45.3125 54.390625
Q 45.3125 60.0625 41.71875 63.234375
Q 38.140625 66.40625 31.78125 66.40625
Q 25.390625 66.40625 21.84375 63.234375
Q 18.3125 60.0625 18.3125 54.390625
" id="DejaVuSans-38"/>
</defs>
<g transform="translate(126.109071 202.798438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-39"/>
<use x="159.033203" xlink:href="#DejaVuSans-38"/>
</g>
</g>
</g>
<g id="xtick_3">
<g id="line2d_3">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="185.183442" xlink:href="#mc4218d1ff0" y="188.2"/>
</g>
</g>
<g id="text_3">
<!-- 0.99 -->
<g transform="translate(174.050629 202.798438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-39"/>
<use x="159.033203" xlink:href="#DejaVuSans-39"/>
</g>
</g>
</g>
<g id="xtick_4">
<g id="line2d_4">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="233.125" xlink:href="#mc4218d1ff0" y="188.2"/>
</g>
</g>
<g id="text_4">
<!-- 1.00 -->
<defs>
<path d="M 12.40625 8.296875
L 28.515625 8.296875
L 28.515625 63.921875
L 10.984375 60.40625
L 10.984375 69.390625
L 28.421875 72.90625
L 38.28125 72.90625
L 38.28125 8.296875
L 54.390625 8.296875
L 54.390625 0
L 12.40625 0
z
" id="DejaVuSans-31"/>
</defs>
<g transform="translate(221.992188 202.798438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-31"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-30"/>
<use x="159.033203" xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
<g id="xtick_5">
<g id="line2d_5">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="281.066558" xlink:href="#mc4218d1ff0" y="188.2"/>
</g>
</g>
<g id="text_5">
<!-- 1.01 -->
<g transform="translate(269.933746 202.798438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-31"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-30"/>
<use x="159.033203" xlink:href="#DejaVuSans-31"/>
</g>
</g>
</g>
<g id="xtick_6">
<g id="line2d_6">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="329.008117" xlink:href="#mc4218d1ff0" y="188.2"/>
</g>
</g>
<g id="text_6">
<!-- 1.02 -->
<defs>
<path d="M 19.1875 8.296875
L 53.609375 8.296875
L 53.609375 0
L 7.328125 0
L 7.328125 8.296875
Q 12.9375 14.109375 22.625 23.890625
Q 32.328125 33.6875 34.8125 36.53125
Q 39.546875 41.84375 41.421875 45.53125
Q 43.3125 49.21875 43.3125 52.78125
Q 43.3125 58.59375 39.234375 62.25
Q 35.15625 65.921875 28.609375 65.921875
Q 23.96875 65.921875 18.8125 64.3125
Q 13.671875 62.703125 7.8125 59.421875
L 7.8125 69.390625
Q 13.765625 71.78125 18.9375 73
Q 24.125 74.21875 28.421875 74.21875
Q 39.75 74.21875 46.484375 68.546875
Q 53.21875 62.890625 53.21875 53.421875
Q 53.21875 48.921875 51.53125 44.890625
Q 49.859375 40.875 45.40625 35.40625
Q 44.1875 33.984375 37.640625 27.21875
Q 31.109375 20.453125 19.1875 8.296875
" id="DejaVuSans-32"/>
</defs>
<g transform="translate(317.875304 202.798438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-31"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-30"/>
<use x="159.033203" xlink:href="#DejaVuSans-32"/>
</g>
</g>
</g>
<g id="xtick_7">
<g id="line2d_7">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="376.949675" xlink:href="#mc4218d1ff0" y="188.2"/>
</g>
</g>
<g id="text_7">
<!-- 1.03 -->
<defs>
<path d="M 40.578125 39.3125
Q 47.65625 37.796875 51.625 33
Q 55.609375 28.21875 55.609375 21.1875
Q 55.609375 10.40625 48.1875 4.484375
Q 40.765625 -1.421875 27.09375 -1.421875
Q 22.515625 -1.421875 17.65625 -0.515625
Q 12.796875 0.390625 7.625 2.203125
L 7.625 11.71875
Q 11.71875 9.328125 16.59375 8.109375
Q 21.484375 6.890625 26.8125 6.890625
Q 36.078125 6.890625 40.9375 10.546875
Q 45.796875 14.203125 45.796875 21.1875
Q 45.796875 27.640625 41.28125 31.265625
Q 36.765625 34.90625 28.71875 34.90625
L 20.21875 34.90625
L 20.21875 43.015625
L 29.109375 43.015625
Q 36.375 43.015625 40.234375 45.921875
Q 44.09375 48.828125 44.09375 54.296875
Q 44.09375 59.90625 40.109375 62.90625
Q 36.140625 65.921875 28.71875 65.921875
Q 24.65625 65.921875 20.015625 65.03125
Q 15.375 64.15625 9.8125 62.3125
L 9.8125 71.09375
Q 15.4375 72.65625 20.34375 73.4375
Q 25.25 74.21875 29.59375 74.21875
Q 40.828125 74.21875 47.359375 69.109375
Q 53.90625 64.015625 53.90625 55.328125
Q 53.90625 49.265625 50.4375 45.09375
Q 46.96875 40.921875 40.578125 39.3125
" id="DejaVuSans-33"/>
</defs>
<g transform="translate(365.816863 202.798438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-31"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-30"/>
<use x="159.033203" xlink:href="#DejaVuSans-33"/>
</g>
</g>
</g>
</g>
<g id="matplotlib.axis_2">
<g id="ytick_1">
<g id="line2d_8">
<defs>
<path d="M 0 0
L -3.5 0
" id="ma63d75584e" style="stroke:#000000;stroke-width:0.8;"/>
</defs>
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="48.55" xlink:href="#ma63d75584e" y="169.770769"/>
</g>
</g>
<g id="text_8">
<!-- −0.75 -->
<defs>
<path d="M 10.59375 35.5
L 73.1875 35.5
L 73.1875 27.203125
L 10.59375 27.203125
z
" id="DejaVuSans-2212"/>
<path d="M 10.796875 72.90625
L 49.515625 72.90625
L 49.515625 64.59375
L 19.828125 64.59375
L 19.828125 46.734375
Q 21.96875 47.46875 24.109375 47.828125
Q 26.265625 48.1875 28.421875 48.1875
Q 40.625 48.1875 47.75 41.5
Q 54.890625 34.8125 54.890625 23.390625
Q 54.890625 11.625 47.5625 5.09375
Q 40.234375 -1.421875 26.90625 -1.421875
Q 22.3125 -1.421875 17.546875 -0.640625
Q 12.796875 0.140625 7.71875 1.703125
L 7.71875 11.625
Q 12.109375 9.234375 16.796875 8.0625
Q 21.484375 6.890625 26.703125 6.890625
Q 35.15625 6.890625 40.078125 11.328125
Q 45.015625 15.765625 45.015625 23.390625
Q 45.015625 31 40.078125 35.4375
Q 35.15625 39.890625 26.703125 39.890625
Q 22.75 39.890625 18.8125 39.015625
Q 14.890625 38.140625 10.796875 36.28125
z
" id="DejaVuSans-35"/>
</defs>
<g transform="translate(10.904688 173.569987)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-2212"/>
<use x="83.789062" xlink:href="#DejaVuSans-30"/>
<use x="147.412109" xlink:href="#DejaVuSans-2e"/>
<use x="179.199219" xlink:href="#DejaVuSans-37"/>
<use x="242.822266" xlink:href="#DejaVuSans-35"/>
</g>
</g>
</g>
<g id="ytick_2">
<g id="line2d_9">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="48.55" xlink:href="#ma63d75584e" y="147.2121"/>
</g>
</g>
<g id="text_9">
<!-- −0.50 -->
<g transform="translate(10.904688 151.011319)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-2212"/>
<use x="83.789062" xlink:href="#DejaVuSans-30"/>
<use x="147.412109" xlink:href="#DejaVuSans-2e"/>
<use x="179.199219" xlink:href="#DejaVuSans-35"/>
<use x="242.822266" xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
<g id="ytick_3">
<g id="line2d_10">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="48.55" xlink:href="#ma63d75584e" y="124.653431"/>
</g>
</g>
<g id="text_10">
<!-- −0.25 -->
<g transform="translate(10.904688 128.45265)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-2212"/>
<use x="83.789062" xlink:href="#DejaVuSans-30"/>
<use x="147.412109" xlink:href="#DejaVuSans-2e"/>
<use x="179.199219" xlink:href="#DejaVuSans-32"/>
<use x="242.822266" xlink:href="#DejaVuSans-35"/>
</g>
</g>
</g>
<g id="ytick_4">
<g id="line2d_11">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="48.55" xlink:href="#ma63d75584e" y="102.094762"/>
</g>
</g>
<g id="text_11">
<!-- 0.00 -->
<g transform="translate(19.284375 105.893981)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-30"/>
<use x="159.033203" xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
<g id="ytick_5">
<g id="line2d_12">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="48.55" xlink:href="#ma63d75584e" y="79.536093"/>
</g>
</g>
<g id="text_12">
<!-- 0.25 -->
<g transform="translate(19.284375 83.335312)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-32"/>
<use x="159.033203" xlink:href="#DejaVuSans-35"/>
</g>
</g>
</g>
<g id="ytick_6">
<g id="line2d_13">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="48.55" xlink:href="#ma63d75584e" y="56.977425"/>
</g>
</g>
<g id="text_13">
<!-- 0.50 -->
<g transform="translate(19.284375 60.776643)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-35"/>
<use x="159.033203" xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
<g id="ytick_7">
<g id="line2d_14">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="48.55" xlink:href="#ma63d75584e" y="34.418756"/>
</g>
</g>
<g id="text_14">
<!-- 0.75 -->
<g transform="translate(19.284375 38.217975)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-37"/>
<use x="159.033203" xlink:href="#DejaVuSans-35"/>
</g>
</g>
</g>
<g id="text_15">
<!-- 1e−13 -->
<defs>
<path d="M 56.203125 29.59375
L 56.203125 25.203125
L 14.890625 25.203125
Q 15.484375 15.921875 20.484375 11.0625
Q 25.484375 6.203125 34.421875 6.203125
Q 39.59375 6.203125 44.453125 7.46875
Q 49.3125 8.734375 54.109375 11.28125
L 54.109375 2.78125
Q 49.265625 0.734375 44.1875 -0.34375
Q 39.109375 -1.421875 33.890625 -1.421875
Q 20.796875 -1.421875 13.15625 6.1875
Q 5.515625 13.8125 5.515625 26.8125
Q 5.515625 40.234375 12.765625 48.109375
Q 20.015625 56 32.328125 56
Q 43.359375 56 49.78125 48.890625
Q 56.203125 41.796875 56.203125 29.59375
M 47.21875 32.234375
Q 47.125 39.59375 43.09375 43.984375
Q 39.0625 48.390625 32.421875 48.390625
Q 24.90625 48.390625 20.390625 44.140625
Q 15.875 39.890625 15.1875 32.171875
z
" id="DejaVuSans-65"/>
</defs>
<g transform="translate(48.55 18.8)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-31"/>
<use x="63.623047" xlink:href="#DejaVuSans-65"/>
<use x="125.146484" xlink:href="#DejaVuSans-2212"/>
<use x="208.935547" xlink:href="#DejaVuSans-31"/>
<use x="272.558594" xlink:href="#DejaVuSans-33"/>
</g>
</g>
</g>
<g id="line2d_15">
<path clip-path="url(#pc264666532)" d="M 65.329545 180.636364
L 68.719353 169.416135
L 72.10916 138.961228
L 75.498967 127.740999
L 78.888774 134.152559
L 82.278581 116.520771
L 85.668388 124.53522
L 89.058196 119.72655
L 92.448003 100.491872
L 95.83781 108.506321
L 99.227617 103.697652
L 102.617424 105.300542
L 106.007231 100.491872
L 109.397039 106.903432
L 112.786846 108.506321
L 116.176653 108.506321
L 119.56646 111.712101
L 122.956267 118.12366
L 126.346074 87.668754
L 129.735882 81.257194
L 133.125689 95.683203
L 136.515496 103.697652
L 139.905303 130.946779
L 143.29511 119.72655
L 146.684917 94.080313
L 150.074725 108.506321
L 153.464532 97.286093
L 156.854339 105.300542
L 160.244146 86.065864
L 163.633953 119.72655
L 167.02376 108.506321
L 170.413567 97.286093
L 173.803375 110.109211
L 177.193182 92.477423
L 180.582989 106.903432
L 183.972796 94.080313
L 187.362603 89.271644
L 190.75241 116.520771
L 194.142218 92.477423
L 197.532025 86.065864
L 200.921832 100.491872
L 204.311639 102.094762
L 207.701446 84.462974
L 211.091253 84.462974
L 214.481061 105.300542
L 217.870868 87.668754
L 221.260675 114.917881
L 224.650482 103.697652
L 228.040289 97.286093
L 231.430096 79.654305
L 234.819904 60.419627
L 238.209711 108.506321
L 241.599518 108.506321
L 244.989325 114.917881
L 248.379132 116.520771
L 251.768939 111.712101
L 255.158747 74.845635
L 258.548554 102.094762
L 261.938361 121.32944
L 265.328168 78.051415
L 268.717975 98.888983
L 272.107782 100.491872
L 275.49759 119.72655
L 278.887397 108.506321
L 282.277204 110.109211
L 285.667011 111.712101
L 289.056818 111.712101
L 292.446625 94.080313
L 295.836433 108.506321
L 299.22624 65.228296
L 302.616047 92.477423
L 306.005854 79.654305
L 309.395661 94.080313
L 312.785468 95.683203
L 316.175275 129.343889
L 319.565083 116.520771
L 322.95489 124.53522
L 326.344697 100.491872
L 329.734504 89.271644
L 333.124311 97.286093
L 336.514118 97.286093
L 339.903926 92.477423
L 343.293733 74.845635
L 346.68354 102.094762
L 350.073347 82.860084
L 353.463154 108.506321
L 356.852961 98.888983
L 360.242769 92.477423
L 363.632576 102.094762
L 367.022383 113.314991
L 370.41219 121.32944
L 373.801997 110.109211
L 377.191804 60.419627
L 380.581612 92.477423
L 383.971419 62.022517
L 387.361226 50.802288
L 390.751033 97.286093
L 394.14084 54.008067
L 397.530647 66.831186
L 400.920455 49.199398
" style="fill:none;stroke:#1f77b4;stroke-linecap:square;stroke-width:1.5;"/>
</g>
<g id="line2d_16">
<path clip-path="url(#pc264666532)" d="M 65.329545 178.532571
L 68.719353 172.521734
L 72.10916 151.784347
L 75.498967 137.458519
L 78.888774 130.846598
L 82.278581 139.562312
L 85.668388 132.048766
L 89.058196 125.136303
L 92.448003 117.021674
L 95.83781 118.424202
L 99.227617 108.806863
L 102.617424 101.493679
L 106.007231 109.307766
L 109.397039 108.907044
L 112.786846 100.09115
L 116.176653 110.509934
L 119.56646 99.089344
L 122.956267 108.105599
L 126.346074 91.275256
L 129.735882 107.103793
L 133.125689 113.21481
L 136.515496 110.009031
L 139.905303 91.675978
L 143.29511 99.289705
L 146.684917 103.497291
L 150.074725 103.797833
L 153.464532 97.085731
L 156.854339 88.069476
L 160.244146 93.479229
L 163.633953 95.482842
L 167.02376 104.899819
L 170.413567 100.892595
L 173.803375 93.278868
L 177.193182 110.009031
L 180.582989 110.109211
L 183.972796 105
L 187.362603 112.613727
L 190.75241 92.878146
L 194.142218 103.096568
L 197.532025 106.803251
L 200.921832 93.879952
L 204.311639 92.277062
L 207.701446 103.597471
L 211.091253 101.69404
L 214.481061 100.892595
L 217.870868 103.497291
L 221.260675 109.407947
L 224.650482 90.874533
L 228.040289 101.493679
L 231.430096 102.996388
L 234.819904 114.016255
L 238.209711 100.09115
L 241.599518 105.801445
L 244.989325 100.692234
L 248.379132 97.486454
L 251.768939 97.887176
L 255.158747 97.085731
L 258.548554 119.426008
L 261.938361 91.275256
L 265.328168 118.624564
L 268.717975 102.695846
L 272.107782 118.624564
L 275.49759 106.60289
L 278.887397 99.289705
L 282.277204 107.604696
L 285.667011 102.295123
L 289.056818 119.125467
L 292.446625 93.679591
L 295.836433 100.291511
L 299.22624 110.309573
L 302.616047 94.481036
L 306.005854 100.491872
L 309.395661 101.493679
L 312.785468 103.196749
L 316.175275 107.905238
L 319.565083 109.708489
L 322.95489 108.105599
L 326.344697 102.695846
L 329.734504 102.695846
L 333.124311 102.295123
L 336.514118 99.690427
L 339.903926 104.899819
L 343.293733 89.872727
L 346.68354 87.268031
L 350.073347 86.065864
L 353.463154 100.09115
L 356.852961 91.275256
L 360.242769 96.284287
L 363.632576 81.056833
L 367.022383 99.690427
L 370.41219 89.872727
L 373.801997 83.060446
L 377.191804 80.45575
L 380.581612 63.425045
L 383.971419 74.845635
L 387.361226 65.629019
L 390.751033 57.61457
L 394.14084 47.195786
L 397.530647 29.363636
L 400.920455 33.370861
" style="fill:none;stroke:#ff7f0e;stroke-linecap:square;stroke-width:1.5;"/>
</g>
<g id="line2d_17">
<path clip-path="url(#pc264666532)" d="M 65.329545 173.213798
L 68.719353 161.28018
L 72.10916 151.160864
L 75.498967 142.609744
L 78.888774 135.409902
L 82.278581 129.370667
L 85.668388 124.324912
L 89.058196 120.126577
L 92.448003 116.648413
L 95.83781 113.779912
L 99.227617 111.425434
L 102.617424 109.502501
L 106.007231 107.940246
L 109.397039 106.678026
L 112.786846 105.664154
L 116.176653 104.854774
L 119.56646 104.212842
L 122.956267 103.707224
L 126.346074 103.311884
L 129.735882 103.005173
L 133.125689 102.769193
L 136.515496 102.589235
L 139.905303 102.453299
L 143.29511 102.351655
L 146.684917 102.276481
L 150.074725 102.221537
L 153.464532 102.181889
L 156.854339 102.153671
L 160.244146 102.13389
L 163.633953 102.120249
L 167.02376 102.111012
L 170.413567 102.10488
L 173.803375 102.100898
L 177.193182 102.098375
L 180.582989 102.096821
L 183.972796 102.095892
L 187.362603 102.095356
L 190.75241 102.095059
L 194.142218 102.094902
L 197.532025 102.094824
L 200.921832 102.094787
L 204.311639 102.094771
L 207.701446 102.094765
L 211.091253 102.094763
L 214.481061 102.094762
L 217.870868 102.094762
L 221.260675 102.094762
L 224.650482 102.094762
L 228.040289 102.094762
L 231.430096 102.094762
L 234.819904 102.094762
L 238.209711 102.094762
L 241.599518 102.094762
L 244.989325 102.094762
L 248.379132 102.094762
L 251.768939 102.094762
L 255.158747 102.094761
L 258.548554 102.094759
L 261.938361 102.094753
L 265.328168 102.094737
L 268.717975 102.0947
L 272.107782 102.094622
L 275.49759 102.094465
L 278.887397 102.094169
L 282.277204 102.093633
L 285.667011 102.092704
L 289.056818 102.091149
L 292.446625 102.088626
L 295.836433 102.084644
L 299.22624 102.078512
L 302.616047 102.069275
L 306.005854 102.055634
L 309.395661 102.035853
L 312.785468 102.007636
L 316.175275 101.967987
L 319.565083 101.913043
L 322.95489 101.837869
L 326.344697 101.736226
L 329.734504 101.600289
L 333.124311 101.420332
L 336.514118 101.184351
L 339.903926 100.87764
L 343.293733 100.482301
L 346.68354 99.976682
L 350.073347 99.33475
L 353.463154 98.52537
L 356.852961 97.511498
L 360.242769 96.249278
L 363.632576 94.687024
L 367.022383 92.76409
L 370.41219 90.409613
L 373.801997 87.541112
L 377.191804 84.062947
L 380.581612 79.864613
L 383.971419 74.818857
L 387.361226 68.779623
L 390.751033 61.579781
L 394.14084 53.02866
L 397.530647 42.909345
L 400.920455 30.975727
" style="fill:none;stroke:#2ca02c;stroke-linecap:square;stroke-width:1.5;"/>
</g>
<g id="patch_3">
<path d="M 48.55 188.2
L 48.55 21.8
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_4">
<path d="M 417.7 188.2
L 417.7 21.8
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_5">
<path d="M 48.55 188.2
L 417.7 188.2
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_6">
<path d="M 48.55 21.8
L 417.7 21.8
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="legend_1">
<g id="patch_7">
<path d="M 55.55 183.2
L 265.990625 183.2
Q 267.990625 183.2 267.990625 181.2
L 267.990625 136.965625
Q 267.990625 134.965625 265.990625 134.965625
L 55.55 134.965625
Q 53.55 134.965625 53.55 136.965625
L 53.55 181.2
Q 53.55 183.2 55.55 183.2
z
" style="fill:#ffffff;opacity:0.8;stroke:#cccccc;stroke-linejoin:miter;"/>
</g>
<g id="line2d_18">
<path d="M 57.55 143.464063
L 77.55 143.464063
" style="fill:none;stroke:#1f77b4;stroke-linecap:square;stroke-width:1.5;"/>
</g>
<g id="line2d_19"/>
<g id="text_16">
<!-- polynôme -->
<defs>
<path d="M 18.109375 8.203125
L 18.109375 -20.796875
L 9.078125 -20.796875
L 9.078125 54.6875
L 18.109375 54.6875
L 18.109375 46.390625
Q 20.953125 51.265625 25.265625 53.625
Q 29.59375 56 35.59375 56
Q 45.5625 56 51.78125 48.09375
Q 58.015625 40.1875 58.015625 27.296875
Q 58.015625 14.40625 51.78125 6.484375
Q 45.5625 -1.421875 35.59375 -1.421875
Q 29.59375 -1.421875 25.265625 0.953125
Q 20.953125 3.328125 18.109375 8.203125
M 48.6875 27.296875
Q 48.6875 37.203125 44.609375 42.84375
Q 40.53125 48.484375 33.40625 48.484375
Q 26.265625 48.484375 22.1875 42.84375
Q 18.109375 37.203125 18.109375 27.296875
Q 18.109375 17.390625 22.1875 11.75
Q 26.265625 6.109375 33.40625 6.109375
Q 40.53125 6.109375 44.609375 11.75
Q 48.6875 17.390625 48.6875 27.296875
" id="DejaVuSans-70"/>
<path d="M 30.609375 48.390625
Q 23.390625 48.390625 19.1875 42.75
Q 14.984375 37.109375 14.984375 27.296875
Q 14.984375 17.484375 19.15625 11.84375
Q 23.34375 6.203125 30.609375 6.203125
Q 37.796875 6.203125 41.984375 11.859375
Q 46.1875 17.53125 46.1875 27.296875
Q 46.1875 37.015625 41.984375 42.703125
Q 37.796875 48.390625 30.609375 48.390625
M 30.609375 56
Q 42.328125 56 49.015625 48.375
Q 55.71875 40.765625 55.71875 27.296875
Q 55.71875 13.875 49.015625 6.21875
Q 42.328125 -1.421875 30.609375 -1.421875
Q 18.84375 -1.421875 12.171875 6.21875
Q 5.515625 13.875 5.515625 27.296875
Q 5.515625 40.765625 12.171875 48.375
Q 18.84375 56 30.609375 56
" id="DejaVuSans-6f"/>
<path d="M 9.421875 75.984375
L 18.40625 75.984375
L 18.40625 0
L 9.421875 0
z
" id="DejaVuSans-6c"/>
<path d="M 32.171875 -5.078125
Q 28.375 -14.84375 24.75 -17.8125
Q 21.140625 -20.796875 15.09375 -20.796875
L 7.90625 -20.796875
L 7.90625 -13.28125
L 13.1875 -13.28125
Q 16.890625 -13.28125 18.9375 -11.515625
Q 21 -9.765625 23.484375 -3.21875
L 25.09375 0.875
L 2.984375 54.6875
L 12.5 54.6875
L 29.59375 11.921875
L 46.6875 54.6875
L 56.203125 54.6875
z
" id="DejaVuSans-79"/>
<path d="M 54.890625 33.015625
L 54.890625 0
L 45.90625 0
L 45.90625 32.71875
Q 45.90625 40.484375 42.875 44.328125
Q 39.84375 48.1875 33.796875 48.1875
Q 26.515625 48.1875 22.3125 43.546875
Q 18.109375 38.921875 18.109375 30.90625
L 18.109375 0
L 9.078125 0
L 9.078125 54.6875
L 18.109375 54.6875
L 18.109375 46.1875
Q 21.34375 51.125 25.703125 53.5625
Q 30.078125 56 35.796875 56
Q 45.21875 56 50.046875 50.171875
Q 54.890625 44.34375 54.890625 33.015625
" id="DejaVuSans-6e"/>
<path d="M 30.609375 48.390625
Q 23.390625 48.390625 19.1875 42.75
Q 14.984375 37.109375 14.984375 27.296875
Q 14.984375 17.484375 19.15625 11.84375
Q 23.34375 6.203125 30.609375 6.203125
Q 37.796875 6.203125 41.984375 11.859375
Q 46.1875 17.53125 46.1875 27.296875
Q 46.1875 37.015625 41.984375 42.703125
Q 37.796875 48.390625 30.609375 48.390625
M 30.609375 56
Q 42.328125 56 49.015625 48.375
Q 55.71875 40.765625 55.71875 27.296875
Q 55.71875 13.875 49.015625 6.21875
Q 42.328125 -1.421875 30.609375 -1.421875
Q 18.84375 -1.421875 12.171875 6.21875
Q 5.515625 13.875 5.515625 27.296875
Q 5.515625 40.765625 12.171875 48.375
Q 18.84375 56 30.609375 56
M 27.015625 79.984375
L 34.234375 79.984375
L 46.203125 61.625
L 39.421875 61.625
L 30.625 73.578125
L 21.84375 61.625
L 15.046875 61.625
z
" id="DejaVuSans-f4"/>
<path d="M 52 44.1875
Q 55.375 50.25 60.0625 53.125
Q 64.75 56 71.09375 56
Q 79.640625 56 84.28125 50.015625
Q 88.921875 44.046875 88.921875 33.015625
L 88.921875 0
L 79.890625 0
L 79.890625 32.71875
Q 79.890625 40.578125 77.09375 44.375
Q 74.3125 48.1875 68.609375 48.1875
Q 61.625 48.1875 57.5625 43.546875
Q 53.515625 38.921875 53.515625 30.90625
L 53.515625 0
L 44.484375 0
L 44.484375 32.71875
Q 44.484375 40.625 41.703125 44.40625
Q 38.921875 48.1875 33.109375 48.1875
Q 26.21875 48.1875 22.15625 43.53125
Q 18.109375 38.875 18.109375 30.90625
L 18.109375 0
L 9.078125 0
L 9.078125 54.6875
L 18.109375 54.6875
L 18.109375 46.1875
Q 21.1875 51.21875 25.484375 53.609375
Q 29.78125 56 35.6875 56
Q 41.65625 56 45.828125 52.96875
Q 50 49.953125 52 44.1875
" id="DejaVuSans-6d"/>
</defs>
<g transform="translate(85.55 146.964063)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-70"/>
<use x="63.476562" xlink:href="#DejaVuSans-6f"/>
<use x="124.658203" xlink:href="#DejaVuSans-6c"/>
<use x="152.441406" xlink:href="#DejaVuSans-79"/>
<use x="211.621094" xlink:href="#DejaVuSans-6e"/>
<use x="275" xlink:href="#DejaVuSans-f4"/>
<use x="336.181641" xlink:href="#DejaVuSans-6d"/>
<use x="433.59375" xlink:href="#DejaVuSans-65"/>
</g>
</g>
<g id="line2d_20">
<path d="M 57.55 158.542188
L 77.55 158.542188
" style="fill:none;stroke:#ff7f0e;stroke-linecap:square;stroke-width:1.5;"/>
</g>
<g id="line2d_21"/>
<g id="text_17">
<!-- recalculé par la méthode de Horner -->
<defs>
<path d="M 41.109375 46.296875
Q 39.59375 47.171875 37.8125 47.578125
Q 36.03125 48 33.890625 48
Q 26.265625 48 22.1875 43.046875
Q 18.109375 38.09375 18.109375 28.8125
L 18.109375 0
L 9.078125 0
L 9.078125 54.6875
L 18.109375 54.6875
L 18.109375 46.1875
Q 20.953125 51.171875 25.484375 53.578125
Q 30.03125 56 36.53125 56
Q 37.453125 56 38.578125 55.875
Q 39.703125 55.765625 41.0625 55.515625
z
" id="DejaVuSans-72"/>
<path d="M 48.78125 52.59375
L 48.78125 44.1875
Q 44.96875 46.296875 41.140625 47.34375
Q 37.3125 48.390625 33.40625 48.390625
Q 24.65625 48.390625 19.8125 42.84375
Q 14.984375 37.3125 14.984375 27.296875
Q 14.984375 17.28125 19.8125 11.734375
Q 24.65625 6.203125 33.40625 6.203125
Q 37.3125 6.203125 41.140625 7.25
Q 44.96875 8.296875 48.78125 10.40625
L 48.78125 2.09375
Q 45.015625 0.34375 40.984375 -0.53125
Q 36.96875 -1.421875 32.421875 -1.421875
Q 20.0625 -1.421875 12.78125 6.34375
Q 5.515625 14.109375 5.515625 27.296875
Q 5.515625 40.671875 12.859375 48.328125
Q 20.21875 56 33.015625 56
Q 37.15625 56 41.109375 55.140625
Q 45.0625 54.296875 48.78125 52.59375
" id="DejaVuSans-63"/>
<path d="M 34.28125 27.484375
Q 23.390625 27.484375 19.1875 25
Q 14.984375 22.515625 14.984375 16.5
Q 14.984375 11.71875 18.140625 8.90625
Q 21.296875 6.109375 26.703125 6.109375
Q 34.1875 6.109375 38.703125 11.40625
Q 43.21875 16.703125 43.21875 25.484375
L 43.21875 27.484375
z
M 52.203125 31.203125
L 52.203125 0
L 43.21875 0
L 43.21875 8.296875
Q 40.140625 3.328125 35.546875 0.953125
Q 30.953125 -1.421875 24.3125 -1.421875
Q 15.921875 -1.421875 10.953125 3.296875
Q 6 8.015625 6 15.921875
Q 6 25.140625 12.171875 29.828125
Q 18.359375 34.515625 30.609375 34.515625
L 43.21875 34.515625
L 43.21875 35.40625
Q 43.21875 41.609375 39.140625 45
Q 35.0625 48.390625 27.6875 48.390625
Q 23 48.390625 18.546875 47.265625
Q 14.109375 46.140625 10.015625 43.890625
L 10.015625 52.203125
Q 14.9375 54.109375 19.578125 55.046875
Q 24.21875 56 28.609375 56
Q 40.484375 56 46.34375 49.84375
Q 52.203125 43.703125 52.203125 31.203125
" id="DejaVuSans-61"/>
<path d="M 8.5 21.578125
L 8.5 54.6875
L 17.484375 54.6875
L 17.484375 21.921875
Q 17.484375 14.15625 20.5 10.265625
Q 23.53125 6.390625 29.59375 6.390625
Q 36.859375 6.390625 41.078125 11.03125
Q 45.3125 15.671875 45.3125 23.6875
L 45.3125 54.6875
L 54.296875 54.6875
L 54.296875 0
L 45.3125 0
L 45.3125 8.40625
Q 42.046875 3.421875 37.71875 1
Q 33.40625 -1.421875 27.6875 -1.421875
Q 18.265625 -1.421875 13.375 4.4375
Q 8.5 10.296875 8.5 21.578125
M 31.109375 56
z
" id="DejaVuSans-75"/>
<path d="M 56.203125 29.59375
L 56.203125 25.203125
L 14.890625 25.203125
Q 15.484375 15.921875 20.484375 11.0625
Q 25.484375 6.203125 34.421875 6.203125
Q 39.59375 6.203125 44.453125 7.46875
Q 49.3125 8.734375 54.109375 11.28125
L 54.109375 2.78125
Q 49.265625 0.734375 44.1875 -0.34375
Q 39.109375 -1.421875 33.890625 -1.421875
Q 20.796875 -1.421875 13.15625 6.1875
Q 5.515625 13.8125 5.515625 26.8125
Q 5.515625 40.234375 12.765625 48.109375
Q 20.015625 56 32.328125 56
Q 43.359375 56 49.78125 48.890625
Q 56.203125 41.796875 56.203125 29.59375
M 47.21875 32.234375
Q 47.125 39.59375 43.09375 43.984375
Q 39.0625 48.390625 32.421875 48.390625
Q 24.90625 48.390625 20.390625 44.140625
Q 15.875 39.890625 15.1875 32.171875
z
M 38.53125 79.984375
L 48.25 79.984375
L 32.34375 61.625
L 24.859375 61.625
z
" id="DejaVuSans-e9"/>
<path id="DejaVuSans-20"/>
<path d="M 18.3125 70.21875
L 18.3125 54.6875
L 36.8125 54.6875
L 36.8125 47.703125
L 18.3125 47.703125
L 18.3125 18.015625
Q 18.3125 11.328125 20.140625 9.421875
Q 21.96875 7.515625 27.59375 7.515625
L 36.8125 7.515625
L 36.8125 0
L 27.59375 0
Q 17.1875 0 13.234375 3.875
Q 9.28125 7.765625 9.28125 18.015625
L 9.28125 47.703125
L 2.6875 47.703125
L 2.6875 54.6875
L 9.28125 54.6875
L 9.28125 70.21875
z
" id="DejaVuSans-74"/>
<path d="M 54.890625 33.015625
L 54.890625 0
L 45.90625 0
L 45.90625 32.71875
Q 45.90625 40.484375 42.875 44.328125
Q 39.84375 48.1875 33.796875 48.1875
Q 26.515625 48.1875 22.3125 43.546875
Q 18.109375 38.921875 18.109375 30.90625
L 18.109375 0
L 9.078125 0
L 9.078125 75.984375
L 18.109375 75.984375
L 18.109375 46.1875
Q 21.34375 51.125 25.703125 53.5625
Q 30.078125 56 35.796875 56
Q 45.21875 56 50.046875 50.171875
Q 54.890625 44.34375 54.890625 33.015625
" id="DejaVuSans-68"/>
<path d="M 45.40625 46.390625
L 45.40625 75.984375
L 54.390625 75.984375
L 54.390625 0
L 45.40625 0
L 45.40625 8.203125
Q 42.578125 3.328125 38.25 0.953125
Q 33.9375 -1.421875 27.875 -1.421875
Q 17.96875 -1.421875 11.734375 6.484375
Q 5.515625 14.40625 5.515625 27.296875
Q 5.515625 40.1875 11.734375 48.09375
Q 17.96875 56 27.875 56
Q 33.9375 56 38.25 53.625
Q 42.578125 51.265625 45.40625 46.390625
M 14.796875 27.296875
Q 14.796875 17.390625 18.875 11.75
Q 22.953125 6.109375 30.078125 6.109375
Q 37.203125 6.109375 41.296875 11.75
Q 45.40625 17.390625 45.40625 27.296875
Q 45.40625 37.203125 41.296875 42.84375
Q 37.203125 48.484375 30.078125 48.484375
Q 22.953125 48.484375 18.875 42.84375
Q 14.796875 37.203125 14.796875 27.296875
" id="DejaVuSans-64"/>
<path d="M 9.8125 72.90625
L 19.671875 72.90625
L 19.671875 43.015625
L 55.515625 43.015625
L 55.515625 72.90625
L 65.375 72.90625
L 65.375 0
L 55.515625 0
L 55.515625 34.71875
L 19.671875 34.71875
L 19.671875 0
L 9.8125 0
z
" id="DejaVuSans-48"/>
</defs>
<g transform="translate(85.55 162.042188)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-72"/>
<use x="41.082031" xlink:href="#DejaVuSans-65"/>
<use x="102.605469" xlink:href="#DejaVuSans-63"/>
<use x="157.585938" xlink:href="#DejaVuSans-61"/>
<use x="218.865234" xlink:href="#DejaVuSans-6c"/>
<use x="246.648438" xlink:href="#DejaVuSans-63"/>
<use x="301.628906" xlink:href="#DejaVuSans-75"/>
<use x="365.007812" xlink:href="#DejaVuSans-6c"/>
<use x="392.791016" xlink:href="#DejaVuSans-e9"/>
<use x="454.314453" xlink:href="#DejaVuSans-20"/>
<use x="486.101562" xlink:href="#DejaVuSans-70"/>
<use x="549.578125" xlink:href="#DejaVuSans-61"/>
<use x="610.857422" xlink:href="#DejaVuSans-72"/>
<use x="651.970703" xlink:href="#DejaVuSans-20"/>
<use x="683.757812" xlink:href="#DejaVuSans-6c"/>
<use x="711.541016" xlink:href="#DejaVuSans-61"/>
<use x="772.820312" xlink:href="#DejaVuSans-20"/>
<use x="804.607422" xlink:href="#DejaVuSans-6d"/>
<use x="902.019531" xlink:href="#DejaVuSans-e9"/>
<use x="963.542969" xlink:href="#DejaVuSans-74"/>
<use x="1002.751953" xlink:href="#DejaVuSans-68"/>
<use x="1066.130859" xlink:href="#DejaVuSans-6f"/>
<use x="1127.3125" xlink:href="#DejaVuSans-64"/>
<use x="1190.789062" xlink:href="#DejaVuSans-65"/>
<use x="1252.3125" xlink:href="#DejaVuSans-20"/>
<use x="1284.099609" xlink:href="#DejaVuSans-64"/>
<use x="1347.576172" xlink:href="#DejaVuSans-65"/>
<use x="1409.099609" xlink:href="#DejaVuSans-20"/>
<use x="1440.886719" xlink:href="#DejaVuSans-48"/>
<use x="1516.082031" xlink:href="#DejaVuSans-6f"/>
<use x="1577.263672" xlink:href="#DejaVuSans-72"/>
<use x="1618.361328" xlink:href="#DejaVuSans-6e"/>
<use x="1681.740234" xlink:href="#DejaVuSans-65"/>
<use x="1743.263672" xlink:href="#DejaVuSans-72"/>
</g>
</g>
<g id="line2d_22">
<path d="M 57.55 173.620313
L 77.55 173.620313
" style="fill:none;stroke:#2ca02c;stroke-linecap:square;stroke-width:1.5;"/>
</g>
<g id="line2d_23"/>
<g id="text_18">
<!-- simplifié -->
<defs>
<path d="M 44.28125 53.078125
L 44.28125 44.578125
Q 40.484375 46.53125 36.375 47.5
Q 32.28125 48.484375 27.875 48.484375
Q 21.1875 48.484375 17.84375 46.4375
Q 14.5 44.390625 14.5 40.28125
Q 14.5 37.15625 16.890625 35.375
Q 19.28125 33.59375 26.515625 31.984375
L 29.59375 31.296875
Q 39.15625 29.25 43.1875 25.515625
Q 47.21875 21.78125 47.21875 15.09375
Q 47.21875 7.46875 41.1875 3.015625
Q 35.15625 -1.421875 24.609375 -1.421875
Q 20.21875 -1.421875 15.453125 -0.5625
Q 10.6875 0.296875 5.421875 2
L 5.421875 11.28125
Q 10.40625 8.6875 15.234375 7.390625
Q 20.0625 6.109375 24.8125 6.109375
Q 31.15625 6.109375 34.5625 8.28125
Q 37.984375 10.453125 37.984375 14.40625
Q 37.984375 18.0625 35.515625 20.015625
Q 33.0625 21.96875 24.703125 23.78125
L 21.578125 24.515625
Q 13.234375 26.265625 9.515625 29.90625
Q 5.8125 33.546875 5.8125 39.890625
Q 5.8125 47.609375 11.28125 51.796875
Q 16.75 56 26.8125 56
Q 31.78125 56 36.171875 55.265625
Q 40.578125 54.546875 44.28125 53.078125
" id="DejaVuSans-73"/>
<path d="M 9.421875 54.6875
L 18.40625 54.6875
L 18.40625 0
L 9.421875 0
z
M 9.421875 75.984375
L 18.40625 75.984375
L 18.40625 64.59375
L 9.421875 64.59375
z
" id="DejaVuSans-69"/>
<path d="M 37.109375 75.984375
L 37.109375 68.5
L 28.515625 68.5
Q 23.6875 68.5 21.796875 66.546875
Q 19.921875 64.59375 19.921875 59.515625
L 19.921875 54.6875
L 34.71875 54.6875
L 34.71875 47.703125
L 19.921875 47.703125
L 19.921875 0
L 10.890625 0
L 10.890625 47.703125
L 2.296875 47.703125
L 2.296875 54.6875
L 10.890625 54.6875
L 10.890625 58.5
Q 10.890625 67.625 15.140625 71.796875
Q 19.390625 75.984375 28.609375 75.984375
z
" id="DejaVuSans-66"/>
</defs>
<g transform="translate(85.55 177.120313)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-73"/>
<use x="52.099609" xlink:href="#DejaVuSans-69"/>
<use x="79.882812" xlink:href="#DejaVuSans-6d"/>
<use x="177.294922" xlink:href="#DejaVuSans-70"/>
<use x="240.771484" xlink:href="#DejaVuSans-6c"/>
<use x="268.554688" xlink:href="#DejaVuSans-69"/>
<use x="296.337891" xlink:href="#DejaVuSans-66"/>
<use x="331.542969" xlink:href="#DejaVuSans-69"/>
<use x="359.326172" xlink:href="#DejaVuSans-e9"/>
</g>
</g>
</g>
</g>
</g>
<defs>
<clipPath id="pc264666532">
<rect height="166.4" width="369.15" x="48.55" y="21.8"/>
</clipPath>
</defs>
</svg>
digraph "python3-matplotlib" {
rankdir=RL;
node [shape=box, color=black, fillcolor=gray, fontcolor=black, style=filled];
"python3-matplotlib" -> "python3-dateutil" [color=blue];
"python3-dateutil" -> "python3-six" [color=blue,label="(>= 1.5)"];
"python3-six" -> "python3:any" [color=blue,label="(>= 3.4~)"];
"python3:any" -> virt1 [dir=back,arrowtail=inv,color=green];
"python3:any" [shape=octagon];
"python3-dateutil" -> "python3:any" [color=blue,label="(>= 3.3.2-2~)"];
"python3-dateutil" -> "tzdata" [color=blue];
"tzdata" -> "alt1":"debconf" [color=blue,label="(>= 0.5)"];
"alt1":"debconf-2.0" -> virt2 [dir=back,arrowtail=inv,color=green];
"python3-matplotlib" -> "python-matplotlib-data" [color=blue,label="(>= 2.2.2-2)"];
"python-matplotlib-data" -> "fonts-lyx" [color=blue];
"python-matplotlib-data" -> "ttf-bitstream-vera" [color=blue];
"python3-matplotlib" -> "python3-pyparsing" [color=blue,label="(>= 1.5.6)"];
"python3-pyparsing" -> "python3:any" [color=blue,label="(>= 3.3.2-2~)"];
"python3-matplotlib" -> "python3-six" [color=blue,label="(>= 1.10)"];
"python3-matplotlib" -> "python3-tz" [color=blue];
"python3-tz" -> "tzdata" [color=blue];
"python3-tz" -> "python3:any" [color=blue,label="(>= 3.3.2-2~)"];
"python3-matplotlib" -> "libjs-jquery" [color=blue];
"libjs-jquery" -> "jquery" [color=red];
"libjs-jquery" -> "javascript-common";
"python3-matplotlib" -> "libjs-jquery-ui" [color=blue];
"libjs-jquery-ui" -> "libjs-jquery" [color=blue,label="(>= 1.7)"];
"libjs-jquery-ui" -> "javascript-common";
"python3-matplotlib" -> "python3-numpy" [color=blue,label="(>= 1:1.13.1)"];
"python3-numpy" -> "python3" [color=blue,label="(<< 3.7)"];
"python3" -> "python3-minimal" [color=purple,style=bold,label="(= 3.6.5-3)"];
"python3-minimal" -> "python3.6-minimal" [color=blue,label="(>= 3.6.5-2~)"];
"python3.6-minimal" -> "libpython3.6-minimal" [color=blue,label="(= 3.6.5-9)"];
"libpython3.6-minimal" -> "libssl1.1" [color=blue,label="(>= 1.1.0)"];
"libssl1.1" -> "alt1":"debconf" [color=blue,label="(>= 0.5)"];
"libpython3.6-minimal" -> "libpython3.6-stdlib";
"libpython3.6-stdlib" -> "libpython3.6-minimal" [color=blue,label="(= 3.6.5-9)"];
"libpython3.6-stdlib" -> "mime-support" [color=blue];
"mime-support" -> "bzip2";
"bzip2" -> "libbz2-1.0" [color=blue,label="(= 1.0.6-8.1)"];
"bzip2" -> "bzip2" [color=red];
"mime-support" -> "file";
"file" -> "libmagic1" [color=blue,label="(= 1:5.33-2)"];
"libmagic1" -> "libmagic-mgc" [color=blue,label="(= 1:5.33-2)"];
"libmagic-mgc" -> "libmagic-mgc" [color=red];
"file" -> "file" [color=red];
"mime-support" -> "xz-utils";
"xz-utils" -> "liblzma5" [color=blue,label="(>= 5.2.2)"];
"xz-utils" -> "xz-lzma" [color=red];
"xz-utils" -> "xz-utils" [color=red];
"libpython3.6-stdlib" -> "libbz2-1.0" [color=blue];
"libpython3.6-stdlib" -> "libdb5.3" [color=blue];
"libpython3.6-stdlib" -> "libffi6" [color=blue,label="(>= 3.0.4)"];
"libpython3.6-stdlib" -> "liblzma5" [color=blue,label="(>= 5.1.1alpha+20120614)"];
"libpython3.6-stdlib" -> "libmpdec2" [color=blue];
"libpython3.6-stdlib" -> "libncursesw6" [color=blue,label="(>= 6)"];
"libncursesw6" -> "libtinfo6" [color=blue,label="(= 6.1+20180210-3)"];
"libncursesw6" -> "libgpm2";
"libpython3.6-stdlib" -> "libreadline7" [color=blue,label="(>= 7.0~beta)"];
"libreadline7" -> "readline-common" [color=blue];
"readline-common" -> "alt2":"dpkg" [color=blue,label="(>= 1.15.4)"];
"alt2":"install-info" -> "alt2":"dpkg" [color=purple,style=bold,label="(>= 1.16.1)"];
"alt2":"install-info" -> "alt2":"install-info" [color=red];
"readline-common" -> "libreadline-common" [color=red];
"libreadline7" -> "libtinfo6" [color=blue,label="(>= 6)"];
"libpython3.6-stdlib" -> "libsqlite3-0" [color=blue,label="(>= 3.5.9)"];
"libpython3.6-stdlib" -> "libtinfo6" [color=blue,label="(>= 6)"];
"python3.6-minimal" -> "libexpat1" [color=blue,label="(>= 2.1~beta3)"];
"python3.6-minimal" -> "python3.6";
"python3.6" -> "python3.6-minimal" [color=blue,label="(= 3.6.5-9)"];
"python3.6" -> "libpython3.6-stdlib" [color=blue,label="(= 3.6.5-9)"];
"python3.6" -> "mime-support" [color=blue];
"python3.6" -> "python3.6" [color=red];
"python3.6-minimal" -> "python3.6-minimal" [color=red];
"python3-minimal" -> "alt2":"dpkg" [color=blue,label="(>= 1.13.20)"];
"python3-minimal" -> "python3-minimal" [color=red];
"python3" -> "python3.6" [color=blue,label="(>= 3.6.5-2~)"];
"python3" -> "libpython3-stdlib" [color=blue,label="(= 3.6.5-3)"];
"libpython3-stdlib" -> "libpython3.6-stdlib" [color=blue,label="(>= 3.6.5-2~)"];
"python3" -> "python3" [color=red];
"python3-numpy" -> "python3" [color=blue,label="(>= 3.6~)"];
"python3-numpy" -> "python3.6:any" [color=blue];
"python3.6:any" -> virt3 [dir=back,arrowtail=inv,color=green];
"python3.6:any" [shape=octagon];
"python3-numpy" -> "python3:any" [color=blue,label="(>= 3.4~)"];
"python3-numpy" -> "alt3" [color=blue];
"alt3":"libblas3" -> "libgfortran4" [color=blue,label="(>= 7)"];
"libgfortran4" -> "gcc-7-base" [color=blue,label="(= 7.3.0-19)"];
"libgfortran4" -> "libquadmath0" [color=blue];
"libquadmath0" -> "gcc-8-base" [color=blue,label="(= 8.1.0-3)"];
"alt3":"libblas3" -> "libquadmath0" [color=blue,label="(>= 4.6)"];
"alt3":"libblas.so.3" -> "Pr_libblas.so.3" [label="-3-",dir=back,arrowtail=inv,color=green];
"Pr_libblas.so.3" [label="...",style=rounded];
"python3-numpy" -> "alt4" [color=blue];
"alt4":"liblapack3" -> "alt3" [color=blue];
"alt4":"liblapack3" -> "libgfortran4" [color=blue,label="(>= 7)"];
"alt4":"liblapack3" -> "libquadmath0" [color=blue,label="(>= 4.6)"];
"alt4":"liblapack.so.3" -> "Pr_liblapack.so.3" [label="-3-",dir=back,arrowtail=inv,color=green];
"Pr_liblapack.so.3" [label="...",style=rounded];
"python3-numpy" -> "python3-numpy" [color=red];
"python3-matplotlib" -> "python3-numpy-abi9" [color=blue];
"python3-numpy-abi9" -> "python3-numpy" [dir=back,arrowtail=inv,color=green];
"python3-numpy-abi9" [shape=octagon];
"python3-matplotlib" -> "python3" [color=blue,label="(<< 3.7)"];
"python3-matplotlib" -> "python3" [color=blue,label="(>= 3.6~)"];
"python3-matplotlib" -> "python3-cycler" [color=blue,label="(>= 0.10.0)"];
"python3-cycler" -> "python3-six" [color=blue];
"python3-cycler" -> "python3:any" [color=blue,label="(>= 3.3.2-2~)"];
"python3-matplotlib" -> "python3-kiwisolver" [color=blue];
"python3-kiwisolver" -> "python3" [color=blue,label="(<< 3.7)"];
"python3-kiwisolver" -> "python3" [color=blue,label="(>= 3.6~)"];
"python3-kiwisolver" -> "python3-pkg-resources" [color=blue];
"python3-pkg-resources" -> "python3:any" [color=blue,label="(>= 3.3.2-2~)"];
"python3-kiwisolver" -> "python3-kiwisolver" [color=red];
"python3-matplotlib" -> "python3:any" [color=blue,label="(>= 3.3.2-2~)"];
"python3-matplotlib" -> "libfreetype6" [color=blue,label="(>= 2.2.1)"];
"libfreetype6" -> "libpng16-16" [color=blue,label="(>= 1.6.2-1)"];
"python3-matplotlib" -> "libpng16-16" [color=blue,label="(>= 1.6.2-1)"];
"python3-matplotlib" -> "python3-pil";
"python3-pil" -> "python3" [color=blue,label="(<< 3.7)"];
"python3-pil" -> "python3" [color=blue,label="(>= 3.6~)"];
"python3-pil" -> "python3:any" [color=blue,label="(>= 3.3.2-2~)"];
"python3-pil" -> "alt5" [color=blue];
"alt5":"python3-pil.imagetk" -> "python3-pil" [color=blue,label="(= 5.1.0-1)"];
"alt5":"python3-pil.imagetk" -> "python3-tk" [color=blue,label="(>= 3.4.1-2)"];
"python3-tk" -> "python3" [color=blue,label="(>= 3.6.4-1~)"];
"python3-tk" -> "python3" [color=blue,label="(<< 3.8)"];
"python3-tk" -> "blt" [color=blue,label="(>= 2.4z-9)"];
"blt" -> "tk8.6-blt2.5" [color=blue,label="(= 2.5.3+dfsg-5)"];
"tk8.6-blt2.5" -> "libtcl8.6" [color=blue,label="(>= 8.6.0)"];
"libtcl8.6" -> "tzdata" [color=blue];
"tk8.6-blt2.5" -> "libtk8.6" [color=blue,label="(>= 8.6.0)"];
"libtk8.6" -> "libtcl8.6" [color=blue,label="(>= 8.6.0-2)"];
"libtk8.6" -> "libfontconfig1" [color=blue,label="(>= 2.12)"];
"libtk8.6" -> "libfreetype6" [color=blue,label="(>= 2.2.1)"];
"libtk8.6" -> "libxext6" [color=blue];
"libtk8.6" -> "libxft2" [color=blue,label="(>> 2.1.1)"];
"libxft2" -> "libfontconfig1" [color=blue,label="(>= 2.12.6)"];
"libxft2" -> "libfreetype6" [color=blue,label="(>= 2.3.5)"];
"libxft2" -> "libxrender1" [color=blue];
"libtk8.6" -> "libxss1" [color=blue];
"libxss1" -> "libxext6" [color=blue];
"libxss1" -> "x11-common" [color=blue];
"tk8.6-blt2.5" -> "blt4.2" [color=red];
"tk8.6-blt2.5" -> "blt8.0" [color=red];
"tk8.6-blt2.5" -> "blt8.0-unoff" [color=red];
"python3-tk" -> "libtcl8.6" [color=blue,label="(>= 8.6.0)"];
"python3-tk" -> "libtk8.6" [color=blue,label="(>= 8.6.0)"];
"python3-tk" -> "tk8.6-blt2.5" [color=blue,label="(>= 2.5.3)"];
"alt5":"python3-pil.imagetk" -> "python3" [color=blue,label="(<< 3.7)"];
"alt5":"python3-pil.imagetk" -> "python3" [color=blue,label="(>= 3.6~)"];
"alt5":"python3-pil.imagetk" -> "python3:any" [color=blue,label="(>= 3.3.2-2~)"];
"python3-pil" -> "libfreetype6" [color=blue,label="(>= 2.2.1)"];
"python3-pil" -> "libjpeg62-turbo" [color=blue,label="(>= 1.3.1)"];
"libjpeg62-turbo" -> "libjpeg62" [color=red];
"libjpeg62-turbo" -> "libjpeg62" [color=red];
"python3-pil" -> "liblcms2-2" [color=blue,label="(>= 2.2+git20110628)"];
"python3-pil" -> "libtiff5" [color=blue,label="(>= 4.0.3)"];
"libtiff5" -> "libjbig0" [color=blue,label="(>= 2.0)"];
"libtiff5" -> "libjpeg62-turbo" [color=blue,label="(>= 1.3.1)"];
"libtiff5" -> "liblzma5" [color=blue,label="(>= 5.1.1alpha+20120614)"];
"python3-pil" -> "libwebp6" [color=blue,label="(>= 0.5.1)"];
"python3-pil" -> "libwebpdemux2" [color=blue,label="(>= 0.5.1)"];
"libwebpdemux2" -> "libwebp6" [color=blue,label="(>= 0.5.1)"];
"python3-pil" -> "libwebpmux3" [color=blue,label="(>= 0.6.1-2)"];
"libwebpmux3" -> "libwebp6" [color=blue,label="(>= 0.5.1)"];
"python3-pil" -> "python3-olefile";
"python3-olefile" -> "python3:any" [color=blue,label="(>= 3.3.2-2~)"];
"python3-matplotlib" -> "python3-tk";
"python3-matplotlib" -> "python3-matplotlib" [color=red];
"python3-matplotlib" [style="setlinewidth(2)"]
"blt4.2" [style=filled,fillcolor=oldlace];
"blt8.0" [style=filled,fillcolor=oldlace];
"blt8.0-unoff" [style=filled,fillcolor=oldlace];
"jquery" [style=filled,fillcolor=oldlace];
"libreadline-common" [style=filled,fillcolor=oldlace];
"xz-lzma" [style=filled,fillcolor=oldlace];
alt1 [
shape = "record"
label = "<debconf> \{debconf\} | <debconf-2.0> debconf-2.0"
]
alt2 [
shape = "record"
label = "<dpkg> \{dpkg\} | <install-info> install-info"
]
alt3 [
shape = "record"
label = "<libblas3> libblas3 | <libblas.so.3> libblas.so.3"
]
alt4 [
shape = "record"
label = "<liblapack3> liblapack3 | <liblapack.so.3> liblapack.so.3"
]
alt5 [
shape = "record"
label = "<mime-support> [mime-support] | <python3-pil.imagetk> python3-pil.imagetk"
]
virt1 [
shape = "record"
style = "rounded"
label = "<python3> [python3] | <python3> [python3]"
]
virt2 [
shape = "record"
style = "rounded"
label = "<debconf> [debconf] | <cdebconf> \{cdebconf\}"
]
virt3 [
shape = "record"
style = "rounded"
label = "<python3.6> [python3.6] | <python3.6> [python3.6]"
]
"libfontconfig1" [shape=diamond];
"x11-common" [shape=diamond];
}
// Excluded dependencies:
// libc6 libgcc1 libstdc++6 libx11-6 zlib1g
// total size of all shown packages: 106674176
// download size of all shown packages: 29406112
#+OPTIONS: ':nil *:t -:t ::t <:t H:3 \n:nil ^:t arch:headline
#+OPTIONS: author:t broken-links:nil c:nil creator:nil
#+OPTIONS: d:(not "LOGBOOK") date:t e:t email:nil f:t inline:t num:t
#+OPTIONS: p:nil pri:nil prop:nil stat:t tags:t tasks:t tex:t
#+OPTIONS: timestamp:t title:t toc:t todo:t |:t
#+TITLE: Notes pour la séquence 1 du module 4 : « L'enfer des données »
#+AUTHOR: Christophe Pouzat
#+EMAIL: christophe.pouzat@parisdescartes.fr
#+LANGUAGE: fr
#+SELECT_TAGS: export
#+EXCLUDE_TAGS: noexport
#+CREATOR: Emacs 25.3.1 (Org mode 9.0.9)
#+STARTUP: indent
* Introduction
** Deux problèmes
Lorsque nous commençons à travailler sur de « vraies » données, comme lorsque nous nous lançons dans une étude numérique « sérieuse » nécessitant de longs calculs intermédiaires, nous nous trouvons généralement confrontés à deux problèmes :
- les données / résultats intermédiaires sont de nature « diverse » ;
- les données / résultats intermédiaires occupent un grand espace mémoire.
** Les données « non homogènes »
Jusqu'ici nous n'avons présenté qu'un cas concret de données, dans le module 3, avec les données grippales du [[http://www.sentiweb.fr][réseau sentinelles]]. Ces données étaient suffisamment « petites » pour être stockées en format texte et, mêmes si toutes les variables qu'elles contiennent ne sont pas de même nature — par exemple une date, une incidence, une localisation —, elles sont toutes disponibles en même temps ce qui veut dire qu'il y a autant de dates, que de mesures d'incidence et que de localisations. Les données /se prêtent donc bien à une représentation sous forme de table/.
Il y a néanmoins en pratique de très nombreux cas similaires au précédent dans la mesure où les données se présentent sous forme de suites chronologiques (/time series/) — une quantité donnée est mesurée ou estimée à intervalles réguliers au cours d'une « longue » période —, mais où les fréquences de mesures / estimations des différentes suites ne sont pas identiques — elles peuvent même varier au cours du temps. Pour fixer les idées avec un exemple qui devrait parler à tous le monde, nous pouvons considérer les données employées en [[https://fr.wikipedia.org/wiki/Pal%C3%A9oclimatologie][paléoclimatologie]] (la reconstruction du climat du passé). Là, des données annuelles fournies par l'étude des cernes des arbres ([[https://fr.wikipedia.org/wiki/Dendrochronologie][dendrochronologie]]) sont combinées avec des températures reconstruites à partir d'un forage dans la roche ([[https://en.wikipedia.org/wiki/Proxy_(climate)#Boreholes][boreholes]] en anglais) dont la résolution temporelle se dégrade à mesure que l'on remonte dans le temps (quelques dizaines d'années pour le 20e siècle à quelques siècles vers 1500 avant notre ère). Ces données ne se prête pas bien à un stockage sous forme de tableau et les sites qui les fournissent, comme le [[https://www.ncdc.noaa.gov/data-access/paleoclimatology-data/datasets][National Oceanic and Atmospheric Administration]] aux États-Unis, le font sous forme de fichiers séparés. /Il y a néanmoins un intérêt clair, pour le praticien de la recherche reproductible, à « centraliser » les données sur lesquels il travaille ; cela évite, par exemple, les pertes lors des « déplacements » des données/.
** Les données « trop grosses »
Une activité symptomatique de l'état de dégénérescence du capitalisme contemporain est la pratique de [[https://fr.wikipedia.org/wiki/Transactions_%C3%A0_haute_fr%C3%A9quence][transactions à haute fréquence]] : une activité entièrement gérée par ordinateur puisque des « décisions » de vente ou d'achat doivent être « prises » toutes les 100 microsecondes. Ces décisions sont basées sur des données qui arrivent à ce rythme. On conçoit bien, dès lors, qu'un développeur de programmes de transaction à haute fréquence aura tout intérêt à stocker les données sur lesquelles il testera ses algorithmes dans un format :
- plus compacte qu'un format texte ;
- qui peut être utiliser directement pour les calculs.
En effet, pour stocker le nombre 1234567890123456789 il faut 19x7 = 133 bits en format texte ([[https://fr.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange][ASCII]] ou [[https://fr.wikipedia.org/wiki/Unicode#UTF-8][UTF-8)]] alors qu'il loge sur les 64 bits d'un « format binaire » [[https://fr.wikipedia.org/wiki/Entier_(informatique)][entier non-signé]], ce qui donne un gain de 69 bits. De plus, nos ordinateurs lorsqu'ils manipulent la [[https://fr.wikipedia.org/wiki/Cha%C3%AEne_de_caract%C3%A8res][chaîne de caractères]] « 1234567890123456789 » ne savent pas plus la multiplier par 2 que la chaîne « abcdefghijklmnopqrs » ; pour qu'ils puissent multiplier le nombre correspondant à la première il faut d'abord /convertir/ celle-ci en un type arithmétique et cela prends du temps. Ce surcout en temps est complètement négligeable lorsque nous traitons des « petits jeux de données » comme celui du module 3, mais il peut devenir considérable lors du traitement de grosses données.
Fort heureusement, les données financières à haute fréquence ne constituent pas le seul exemple de données trop grosses pour être stockées en format texte. Nous avons en fait déjà rencontré un exemple de « grosses données » dans ce cours lorsque nous avons discuté de l'indexation d'images dans la séquence 5 du module 1. Une image, comme une photo numérique, contient en effet une grande quantité de données. Ainsi l'image que nous avions utilisée en exemple dans la diapo intitulée : « Les fichiers images contiennent des métadonnées » est-elle constituée de 7,8 Mégapixels et chaque pixel contient une information sur trois couleurs, chacune étant résolue avec 256 niveaux (8 bits). Cela fait une quantité énorme de données qui est stockée sous format binaire après [[https://fr.wikipedia.org/wiki/Compression_d%27image][compression]] par le format [[https://fr.wikipedia.org/wiki/JPEG][JPEG]].
** L'intérêt des données au format texte et ce qui serait désirable pour un « bon » format binaire
*** Métadonnées
Le premier intérêt du format texte comme nous l'avons vu dans le premier module est que nous pouvons l'utiliser pour stocker à peu près n'importe quoi. En particulier, ce qui nous préoccupe ici est la capacité à stocker non seulement des données, c'est-à-dire des nombres, mais des informations sur les données : d'où proviennent-elles, à qu'elle date ont elles été enregistrées, par qui, quel instrument / appareil de mesure a été utilisé, avec quels paramètres (comme la fréquence à laquelle une suite chronologique est observée), etc., autant d'informations qui peuvent s'avérer cruciales pour rendre nos résultats reproductibles. Mais ces « informations sur les données » ne sont rien d'autre que les métadonnées que nous avons brièvement discutées dans la séquence 5 du module 1. Elles sont si importantes que des formats de données conçus pour une tâche spécifique, comme le format JPEG pour les photos numériques, inclus une place pour elles dans leur spécifications. /Nous voyons bien que si, pour des raisons de taille mémoire trop importante ou d'efficacité de lecture / écriture, nous nous retrouvons « forcés » d'abandonner un format texte, nous avons tout intérêt à choisir un format binaire qui permet l'inclusion de métadonnées/.
*** Boutisme
Un autre intérêt du format texte, que nous avons aussi mentionné dans le premier module, est son caractère « universel » (dans l'univers de l'informatique !) : un fichier généré sur une machine avec une architecture et un système d'exploitation donné peut être ouvert et lu sans problème sur une autre machine ayant une architecture et un système d'exploitation complètement différents. Cette universalité se perd très vite avec les formats binaires. Le cas typique est lié au [[https://fr.wikipedia.org/wiki/Endianness][boutisme]] ([[https://en.wikipedia.org/wiki/Endianness][endianness]] en anglais, les explications sur cette notion sont plus claires sur site Wikipedia en anglais) qui spécifie par quel bout il faut lire une séquence de bits comme 1010 ; s'il s'agit d'un entier non signé (codé sur 4 bits), on peut faire:
- 1x1 + 0x2 + 1x4 + 0x8 = 5, c'est le /petit-boutisme/ utilisé par Unix/Linux, MacOS et Windows sur processeurs Intel ;
- 1x8 + 0x4 + 1x2 + 0x1 = 10, c'est le /gros-boutisme/ utilisé par les Sparc, Unix/Linux et MacOS sur PowerPC et par les protocoles [[https://fr.wikipedia.org/wiki/Suite_des_protocoles_Internet][TCP/IP]], c'est-à-dire par tout ce qui passe par internet (c'est aussi comme cela que nous écrivons les nombres décimaux : 123 = 1x100 + 2x10 + 3x1).
Il est évident que le stockage de données binaires à des fins de recherche reproductible devrait toujours se faire avec des formats dont le boutisme a été spécifié « une fois pour toute ».
* Des formats binaires, pour données composites, permettant le sauvegarde de métadonnées
Les préoccupations que nous avons évoquées dans la section précédente ne sont évidemment pas nouvelles, même mesurées à l'aune de l'ère numérique.
De façon non surprenante, ce sont les astrophysiciens qui ont très tôt développé des formats de fichiers de données numériques qui remplissent les critères induits par notre discussion précédente :
- des données de grandes tailles et de natures différentes doivent pouvoir être sauvegardées dans un même fichier ;
- des métadonnées doivent pouvoir être sauvegardées dans le même fichier ;
- le boutisme est spécifié.
En effet, les astrophysiciens ont très tôt commencés à utiliser des « capteurs numériques », comme les dispositifs à transfert de charges — plus connus sous leur nom anglais de /charge-coupled device/ qui donne l'acronyme [[https://en.wikipedia.org/wiki/Charge-coupled_device][CCD]] —, ils enregistrent des quantités massives de données qui sont le plus souvent de nature variée allant de la « simple image » à des spectres résolus dans le temps et dans l'espace (c'est-à-dire des objets à 5 dimensions). Nous allons présenter ici deux des formats de fichiers développé successivement, le premier par les astrophysiciens, le second pour les applications numériques sur « super-ordinateurs » :
- le /Flexible Image Transport System/ ([[https://fr.wikipedia.org/wiki/Flexible_Image_Transport_System][FITS]]), créé en 1981 est toujours régulièrement mis à jour — l'adresse du site officiel est : [[https://fits.gsfc.nasa.gov/]] — ;
- le /Hierarchical Data Format/ ([[https://fr.wikipedia.org/wiki/Hierarchical_Data_Format][HDF]]), développé au /National Center for Supercomputing Applications/, il en est à sa cinquième version, =HDF5= — l'adresse du site officiel est : https://www.hdfgroup.org/.
** « Bonus »
*** Bibliothèques
Les deux formats de fichiers que nous venons d'introduire, =FITS= et =HDF5=, sont en fait plus que des « formats » puisque les institutions / consortiums qui les développent distribuent également une ou plusieurs bibliothèques de fonctions (ainsi que des programmes) permettant de manipuler ces fichiers — un des reproches couramment adressé au format HDF5 est d'ailleurs le fait qu'il est tellement compliqué, que personne ne s'est jamais lancé dans le développement d'une bibliothèque de manipulation indépendante de celle distribué par le consortium.
*** Lecture partielle de données
Les deux formats ont été conçus pour de très grosses données, tellement grosses qu'elle peuvent ne pas loger dans la [[https://fr.wikipedia.org/wiki/M%C3%A9moire_vive][mémoire vive]] (=RAM=) d'un ordinateur « typique » de laboratoire. Les bibliothèques fournissent donc des fonctions qui permettent de ne charger en RAM, par exemple, qu'une partie d'une très grosse matrice, cela de façon « transparente » : le code de l'utilisateur est écrit comme si la totalité de la matrice était en RAM (c'est la bibliothèque qui gère le va et vient nécessaire entre RAM et disque).
** FITS
Comme nous l'avons écrit, le format =FITS= a été introduit et continue d'être mis à jour par les astrophysiciens. Ce format est néanmoins suffisamment général pour être utilisé dans des contextes très différents comme en témoigne son adoption par le projet de numérisation des manuscrits de la [[https://www.vaticanlibrary.va/home.php?pag=progettodigit][bibliothèque vaticane]]. Sans aller jusqu'à considérer cette adoption comme une [[https://fr.wikipedia.org/wiki/Imprimatur][imprimatur]], elle témoigne clairement d'une adaptabilité du format.
*** Anatomie d'un fichier =FITS=
Un fichier =FITS= peut contenir un nombre arbitraire de segments appelés « Header/Data Units (HDUs) » — voir le [[https://fits.gsfc.nasa.gov/fits_primer.html][primer ]]pour plus de détails. Ces segments sont placés « à la queue leu leu » dans le fichier — c'est-à-dire qu'il n'y a pas de structure hiérarchique comme dans les fichiers =HDF5= que nous discutons plus loin.
Le premier segment qui est obligatoire dans tout fichier =FITS= (même s'il ne contient pas de données). Il est nommé HDU primaire (/Primary HDU/ ou /Primary Array/). Il ne peut contenir qu'un tableau au sens large — c'est-à-dire avec 1, 2 ou plus de dimensions (jusqu'à 999), c'est ce qu'on nomme /array/ en anglais — au format binaire (entiers ou [[https://fr.wikipedia.org/wiki/Virgule_flottante][virgule flottante]]).
Les segments suivants sont facultatifs et son désignés par le terme d'« extension » dans le jargon =FITS=. Les extensions peuvent contenir des tableaux comme l'HDU primaire, mais aussi des tables (objets à 2 dimensions) au format texte (ASCII) ou binaire.
Chaque HDU consiste en une en-tête (/Header Unit/ en jargon =FITS=) suivie, /mais ce n'est pas obligatoire/, par des données (/Data Unit/ en jargon =FITS=). Chaque en-tête est formée de paires de « mots clés / valeurs ». Les paires de mots clés / valeurs fournissent des informations telles que la taille, l'origine, les coordonnées, le format de données binaire, les commentaires en format libre, l'historique des données, et /toute autre chose souhaitée par le rédacteur/ ; tandis que beaucoup de mots-clés sont réservés pour l'usage interne, la norme permet l'utilisation arbitraire du reste (source [[https://fr.wikipedia.org/wiki/Flexible_Image_Transport_System][Wikipédia]]).
*** Manipulation des fichiers =FITS=
Le consortium qui développe le format =FITS= fournit une bibliothèque [[https://heasarc.gsfc.nasa.gov/docs/software/fitsio/fitsio.html][CFITSIO]] en langage =C= ainsi qu'une collection de programmes associés. Notre expérience est que la bibliothèque, comme les programmes sont simples d'emploi et « bien pensés ».
Les utilisateurs de =Python= pourront utiliser [[https://pythonhosted.org/pyfits/][PyFITS]], une interface très complète avec [[https://heasarc.gsfc.nasa.gov/docs/software/fitsio/fitsio.html][CFITSIO]].
Les utilisateurs de =R= pourront utiliser [[https://cran.r-project.org/package=FITSio][FITSio]].
Des [[https://fits.gsfc.nasa.gov/fits_libraries.html][interfaces existent]] également pour =Java=, =Perl=, =Matlab=, etc.
** HDF5
*** La présentation d'=HDF5= par ses concepteurs
HDF5 est un modèle de données, une bibliothèque et un format de fichier pour stocker et gérer des données. Il prend en charge une variété illimitée de types de données et est conçu pour des entrées / sorties flexibles et efficaces, pour des volumes élevés et des données complexes. HDF5 est utilisable sur différentes plateformes et est extensible. Il permet aux applications d'évoluer dans leur utilisation d'HDF5. La suite technologique HDF5 comprend des outils et des applications pour gérer, manipuler, visualiser et analyser des données au format HDF5.
La [[https://portal.hdfgroup.org/display/HDF5/HDF5][version originale]] du texte ci-dessus :
HDF5 is a data model, library, and file format for storing and managing data. It supports an unlimited variety of datatypes, and is designed for flexible and efficient I/O and for high volume and complex data. HDF5 is portable and is extensible, allowing applications to evolve in their use of HDF5. The HDF5 Technology suite includes tools and applications for managing, manipulating, viewing, and analyzing data in the HDF5 format.
*** Différences majeurs avec =FITS=
Comme son nom l'indique avec le « H » pour /Hierarchical/, l'organisation interne d'un fichier =HDF5= est hierarchique et ressemble elle-même à une arborisation de fichiers. Cela contraste avec l'organisation « plate » des fichiers =FITS= et cela permet clairement d'ordonner des données complexes plus efficacement.
Ainsi un expérimentateur qui effectue des mesures répétées dans les mêmes conditions sur un même objet peut il stoker chaque « mesure » — qui peut elle-même générer des données complexes, /dataset/ en jargon =HDF=, comme une séquence d'images et une ou plusieurs suites chronologiques — dans l'équivalent d'un répertoire, un /group/ en jargon =HDF=. Cela permet à notre expérimentateur de créer un /group/ par condition expérimentale. Comme dans le cas d'une arborescence de répertoires sur le disque d'un ordinateur, les /groups/ peuvent eux-mêmes contenir des /groups/ (les répertoires peuvent avoir des sous-répertoires). Clairement, l'aspect structuré du format =HDF5=, facilite la navigation dans les jeux de données (/datasets/) et constitue une véritable amélioration par-rapport au format =FITS=.
Les méta-données n'ont pas de structure imposée mots clés / valeurs comme dans le cas du format =FITS=. Les données (/datasets/) n'ont pas non plus de structure imposée ce qui permet par exemple d'y stocker de longs textes, comme un article ou des codes sources. Encore une fois, cette possibilité n'est pas présente dans les fichiers =FITS=.
*** Manipulation des fichiers =HDF5=
La plus grande « souplesse » du format =HDF5= se « paie » par une bibliothèque de manipulation =C= (nettement) plus difficile à utiliser que son équivalent du format =FITS=. La bibliothèque vient avec de nombreux programmes utilisables depuis la ligne de commande, ainsi qu'avec une application =JAVA=, [[https://portal.hdfgroup.org/display/HDFVIEW/HDFView][HDFView]], très puissante pour explorer, visualiser et, dans une certaine mesure, éditer les fichiers =HDF5=.
=Python= dispose d'une interface très complète avec [[http://www.h5py.org/][h5py]].
Il y a trois paquets =R= pour manipuler les fichiers =HDF5= : [[https://CRAN.R-project.org/package=h5][h5]], [[https://CRAN.R-project.org/package=hdf5r][hdf5r]] et [[http://www.bioconductor.org/packages/release/bioc/html/rhdf5.html][rhdf5]]. Les deux premiers sont disponibles sur le /Comprehensive R Archive Network/ ([[https://cran.r-project.org/][CRAN]]), et le dernier est disponible sur [[http://www.bioconductor.org/][bioconductor]]. Le plus complet à ce jour est =hdf5r=, mais les trois permettent toutes les opérations de bases et même plus.
*** Pour aller plus loin
Une présentation par Martial Tola : [[https://perso.liris.cnrs.fr/martial.tola/presentations/hdf5/]].
Le blog de C. Rossant présente une critique intéressante et argumentée du format : [[http://cyrille.rossant.net/moving-away-hdf5/]].
#+STARTUP: overview indent inlineimages logdrawer
#+TITLE: C028AL-W2
#+AUTHOR: Arnaud Legrand
#+TAGS: noexport(n)
* Test et informations :noexport:
* Internal refs/notes :noexport:
** Images
- Notebook konrad:
- file:../slides-module2/jupyter-grippal-full.png
- file:../slides-module2/jupyter-grippal-top.png
- file:../slides-module2/jupyter-grippal-bottom.png
#+begin_src shell :results output :exports both
cd /home/alegrand/Work/Documents/Enseignements/RR_MOOC/slides-module2
file jupyter-grippal-full.png
rm /tmp/cropped_*
convert -crop 1345x3000 jupyter-grippal-full.png /tmp/cropped_%d.png
convert /tmp/cropped_*.png +append jupyter-grippal-paged.png
#+end_src
#+RESULTS:
: jupyter-grippal-full.png: PNG image data, 1345 x 8772, 8-bit/color RGBA, non-interlaced
#+begin_src shell :results output :exports both
cd /home/alegrand/Work/Documents/Enseignements/RR_MOOC/slides-module2
convert -scale x1507 jupyter-grippal-paged.png ../assets/img/nb3.png
#+end_src
#+RESULTS:
- Notebook Elisabeth: https://bitbucket.org/elizabethpwalton/smpe_project
#+begin_src shell :results output :exports both
cd /home/alegrand/Work/Documents/Enseignements/RR_MOOC/slides-module2
file elizabethpwalton_SMPE.png
rm /tmp/cropped_*
convert -crop 820x2650 elizabethpwalton_SMPE.png /tmp/cropped_%d.png
convert /tmp/cropped_*.png +append elizabethpwalton_SMPE-aged.png
#+end_src
#+RESULTS:
: elizabethpwalton_SMPE.png: PNG image data, 820 x 15217, 8-bit/color RGBA, non-interlaced
#+begin_src shell :results output :exports both
cd /home/alegrand/Work/Documents/Enseignements/RR_MOOC/slides-module2
convert -scale x1507 elizabethpwalton_SMPE-aged.png ../assets/img/nb4.png
#+end_src
#+RESULTS:
- Notebook Ismail:
#+begin_src shell :results output :exports both
cd /home/alegrand/Work/Documents/Enseignements/RR_MOOC/slides-module2
rm /tmp/cropped_*
convert -crop 590x1400 oscar.png /tmp/cropped_%d.png
for i in /tmp/cropped_[1-9].png ; do mv $i `echo $i | sed 's/cropped_/cropped_0/'` ; done
convert /tmp/cropped_*.png +append And_the_Oscar_goes_to-paged.png
#+end_src
#+RESULTS:
#+begin_src shell :results output :exports both
cd /home/alegrand/Work/Documents/Enseignements/RR_MOOC/slides-module2
convert -scale x1507 And_the_Oscar_goes_to-paged.png ../assets/img/nb5.png
#+end_src
#+RESULTS:
- Navette russe: https://io9.gizmodo.com/more-sad-remains-of-the-soviet-buran-space-shuttle-prog-1733190814
- Msieur il marche mon programme: https://www.luc-damas.fr/humeurs/images/il-marche-mon-programme.jpg
- PhD Comics:
- http://phdcomics.com/comics/archive.php?comicid=1947:
http://phdcomics.com/comics/archive/phd050817s.gif
- http://phdcomics.com/comics/archive.php?comicid=1948:
http://phdcomics.com/comics/archive/phd051017s.gif
** Graphe syndrome grippal:
#+begin_src shell :results output raw :exports both
debtree python3-matplotlib > python3-matplotlib.dot
sed -i -e 's/rankdir=LR/rankdir=RL/g' \
-e 's/node \[shape=box\]/node [shape=box, color=black, fillcolor=gray, fontcolor=black, style=filled]/g' \
python3-matplotlib.dot
dot -Tpng python3-matplotlib.dot > python3-matplotlib.png
echo file:python3-matplotlib.png
#+end_src
#+RESULTS:
file:python3-matplotlib.png
#+begin_src shell :results output :exports both
mv python3-matplotlib.png ../assets/img/
#+end_src
#+RESULTS:
* C028AL-W0-S0 (\approx 2:00); Introduction :noexport:
:LOGBOOK:
- State "TODO" from [2018-01-29 lun. 14:29]
:END:
** La recherche reproductible
*La recherche reproductible* s'intéresse à la mise en oeuvre et à la
promotion de meilleurs pratiques de recherche, et ce aussi bien sur le
plan technique qu'épistémologique.
*Petite bio, parcours, activité actuelle*: Pourquoi nous nous y
intéressons ?
Que vous preniez des notes, que vous génériez des figures, de gros
calculs ou des analyse de données, la recherche reproductible peut vous
intéresser.
Allons-y! :)
** Structure du cours
- *Cahier de notes, cahier de labo*
- *Le document computationnel*
- *Une analyse réplicable* <font style="font-size:28px">Pour le premier module, pas de prérequis particulier. À partir du
2ème, on suppose une familarité avec les langages de programmation
python ou R. </font>
A. Intégration Gitlab Jupyter
B. R/Rstudio,
C. Org-Mode <br>
<font style="font-size:28px">À ce stade, vous devriez commencez à maîtriser des outils modernes
permettant de singulièrement améliorer votre quotidien. Mais la
route est longue. Nous vous présenterons donc dans le dernier
module, les</font>
- Autres défis de la recherche reproductible<br>
<font style="font-size:28px">Ce module ci est plus technique mais vous permettra de prendre du
recul et de bien identifier les difficultés spécifiques à votre
domaine et auxquelles vous serez confrontés.</font>
* C028AL-W2-S0 (\approx 2:00); Vers une étude reproductible : la réalité du terrain
** L'enfer de la Recherche Reproductible
# <img src="https://www.kdnuggets.com/wp-content/uploads/expectation_vs_reality.png" style="height:400px"/>
# http://thumbpress.com/wp-content/uploads/2014/04/funny-water-toy-kids-playing1.jpg
#+BEGIN_EXPORT html
<img src="assets/img/phd_sisyphe.gif"/>
#+END_EXPORT
Note:
Bonjour à tous,
Maintenant que vous êtes familiers avec les documents computationnels
et les analyses réplicables, vous disposez des outils principaux vous
permettant d'améliorer votre pratique et de rendre votre recherche
reproductible.
Mais la route est longue et semée d'embûches. Il est temps d'aller un
peu plus loin et que vous preniez consciences des différentes
difficultés auxquelles vous risquez d'être confronté.
Dans ce dernier module, nous vous présenterons trois des enfers de la
recherche reproductible.
** Module 4. Vers une étude reproductible : la réalité du terrain
1. <!-- .element class="fragment highlight-current-red" --> L'enfer des données
2. <!-- .element class="fragment highlight-current-red" --> L'enfer du logiciel
3. <!-- .element class="fragment highlight-current-red" --> L'enfer du calcul
4. <!-- .element class="fragment highlight-current-red" --> Conclusion
Note:
Christophe: Le premier enfer est celui des données. Quand on travaille
sur de vrais données, leur taille, leur structure, ou leur diversité
peuvent rapidement poser d'importantes difficultés. Je présenterai
quelques approches permettant de survivre dans cet environnement
hostile.
Arnaud: Le second enfer est celui du logiciel et on se trouve
rapidement confronté à deux défis. D'une part, le logiciel devient
très rapidement gros, difficile à gérer, et les solutions simples que
nous vous avons présentées passent alors très mal à
l'échelle. D'autre part, aussi étonnant que cela puisse paraître, les
logiciels vieillissent et résistent souvent très mal à l'épreuve du
temps. Je présenterai des exemples concrets et quelques approches
permettant de survivre dans cet environnement hostile.
Konrad: Enfin, le troisième enfer est celui du calcul
numérique. J'illustrerai les difficultés que peut poser le calcul avec
des flottants, ou l'ordre des opérations influe sur les
résultats. Comme cet ordre a aussi un impact sur la performance, il
faut trouver un compromis entre temps d'exécution et
reproductibilité. Ceci est particulièrement difficile pour le calcul
parallèle, qui concerne tous les ordinateurs modernes, même les
smartphones. J'évoquerai aussi les précautions à prendre quand on
utilise les nombres aléatoires.
En espérant ne pas vous avoir trop effrayés, nous concluerons enfin
brièvement ce MOOC par quelques remarques de bon sens.
* C028AL-W2-S1 (\approx 10:00); L'enfer des données
** Vers une étude reproductible : la réalité du terrain
_Module 4. Vers une étude reproductible : la réalité du terrain_
1. *L'enfer des données*
2. L'enfer du logiciel
3. L'enfer du calcul
4. Conclusion
#+BEGIN_EXPORT html
+++
## Deux « nouveaux » problèmes
Lorsque nous commençons à travailler sur de « vraies » données nous nous trouvons généralement confrontés à deux problèmes :
- les données sont de nature « diverse »
- les données occupent un grand espace mémoire
+++
## Les données « non homogènes »
- Les données grippales du module 3 se prêtent bien à une présentation en table (objet à 2 dimensions)
- Souvent la forme table doit être *abandonnée* car :
- les colonnes n'ont pas la même longueur
- les données peuvent être des suites chronologiques **et** des images, etc.
+++
## Les données sont « trop grosses »
- **Format texte** pas toujours approprié pour des nombres
- Choix d'un **format binaire** car :
- Les nombres prennent moins de place mémoire
- Nombres en format texte ⇒ conversion en binaire pour calculs
+++
## Ce qu'il faut garder du format texte : les métadonnées
- Le format texte permet de stocker les données **et** tout le reste...
- ⇒ ajouter des informations sur les données :
- provenance
- date d'enregistrement
- source
- etc.
+++
## <br/><br/>
- Ces informations sur les données sont ce qu'on appelle les **métadonnées**
- Elles sont vitales pour la mise en œuvre de la recherche reproductible
+++
## Ce qu'il faut garder du format texte : le boutisme
- Format texte « universel »
- Formats binaires dépendent de l'architecture ou de l'OS
- 1010, codé sur 4 bits peut être lu comme :
- 1x1 + 0x2 + 1x4 + 0x8 = 5, c'est le *petit-boutisme*
- 1x8 + 0x4 + 1x2 + 0x1 = 10, c'est le *gros-boutisme*
- **Un stockage binaire pour la recherche reproductible doit spécifier le boutisme**
+++
## Des formats binaires, pour données composites, permettant le sauvegarde de métadonnées
Rechercher des formats binaires pour :
- travailler avec de grosses données de natures différentes
- stocker des métadonnées avec les données
- avoir un boutisme fixé **une fois pour toute**
+++
## `FITS` et `HDF5`
- Le *Flexible Image Transport System* (`FITS`), créé en 1981 est toujours régulièrement mis à jour
- Le *Hierarchical Data Format* (`HDF`), développé au *National Center for Supercomputing Applications*, il en est à sa cinquième version, `HDF5`
+++
## `FITS`
- `FITS` introduit et mis à jour par les astrophysiciens
- Format suffisamment général pour utilisation dans différents contextes
+++
## Anatomie d'un fichier `FITS`
- 1 ou plusieurs segments : *Header/Data Units* (HDUs)
- HDU constituée :
- d'une en-tête (*Header Unit*) suivie, *mais ce n'est pas obligatoire*, par
- des données (*Data Unit*)
- En-tête = paires mots clés / valeurs → **métadonnées**
- Données tableaux binaires (une à 999 dimensions) ou tables (texte ou binaire)
+++
## Manipulation des fichiers `FITS`
- Les développeurs du format fournissent une bibliothèque `C` et des programmes associés (faciles à utiliser)
- Les utilisateurs de `Python` pourront utiliser `PyFITS`
- Les utilisateurs de `R` pourront utiliser `FITSio`
+++
## `HDF5`
- Organisation hiérarchique, ressemble à une arborisation de fichiers
- Élément structurant : le *group* (répertoire) contient un ou plusieurs *datasets* (jeux de données)
- Les *groups* peuvent être imbriqués
- Les métadonnées n'ont pas de structure imposée
- Les données n'ont pas de structure imposée — elles peuvent être des textes.
+++
## Manipulation des fichiers `HDF5`
- Format plus souple ⇒ bibliothèque `C` plus compliquée que son équivalent `FITS`
- La bibliothèque distribuée avec `HDFView` : outil puissant d'exploration et de visualisation
- `Python` dispose d'une interface très complète avec `h5py`
- Il y a trois paquets `R` : `h5`, `hdf5r` et `rhdf5`
+++
## L'archivage
Git (hub, lab, ...) : pas bien adapté au stockage de données
<img src="assets/img/Zenodo-logo.jpg" height=120 /> <img src="assets/img/Figshare-logo.png" height=120 />
+++
## Conclusions
- Vraies données ⇒ problèmes de taille et de structure
- Vraies données complexes ⇒ métadonnées
- `FITS` et `HDF5` = solutions **pratiques**
- En complexité et flexibilité : `FITS` < `HDF5`
- Plates-formes d'archivage ⇒ stockage pérenne accessible à tous
#+END_EXPORT
* C028AL-W2-S2 (\approx 14:00); L'enfer du logiciel
** Vers une étude reproductible : la réalité du terrain
_Module 4. Vers une étude reproductible : la réalité du terrain_
1. L'enfer des données
2. *L'enfer du logiciel*
3. L'enfer du calcul
4. Conclusion
** Passage à l'échelle file:assets/img/il-marche-mon-programme.jpg&size=contain
** Des codes complexes...
#+BEGIN_HTML
<img src="assets/img/nb1.png" height=600 data-fragment-index="1" class="fragment current-visible"/>
<img src="assets/img/nb2.png" height=600 data-fragment-index="2" class="fragment current-visible"/>
<img src="assets/img/nb3.png" height=600 data-fragment-index="3" class="fragment current-visible"/>
<img src="assets/img/nb4.png" height=600 data-fragment-index="4" class="fragment current-visible"/>
<img src="assets/img/grippal_orgmode1.png" height=600 data-fragment-index="5" class="fragment current-visible"/>
<img src="assets/img/grippal_orgmode2.png" height=600 data-fragment-index="6" class="fragment current-visible"/>
<img src="assets/img/nb5.png" data-fragment-index="7" class="fragment current-visible"/>
#+END_HTML
- <!-- .element class="fragment" data-fragment-index="7"--> Un vrai
plat de spaghettis
- <!-- .element class="fragment" data-fragment-index="7"--> Pas de
vision d'ensemble
- <!-- .element class="fragment" data-fragment-index="7"-->
Interaction entre plusieurs langages = danger
Note:
- Des codes compliqués à organiser/orchestrer. Le notebook a ses
limitations et vous pouvez en devenir prisonnier.
** ... et difficiles à orchestrer
#+BEGIN_HTML
<img src="http://www.mcisb.org/resources/taverna/sysbio/images/SbmlParameterisation.png" height=600 data-fragment-index="1" class="fragment current-visible"/>
<img src="http://www.mcisb.org/resources/taverna/sysbio/images/SbmlModelling.png" height=600 data-fragment-index="2" class="fragment current-visible"/>
#+END_HTML
<!-- .element class="fragment" data-fragment-index="3"--> Le *Workflow* :
- Vue de haut niveau plus claire
- Compositions de codes et mouvements de données explicites
- Partage, réutilisation, et exécution plus sûre
- Le notebook en est une forme à la fois appauvrie et plus riche
- Pas de façon simple/mature de passer d'un notebook à un
workflow
<!-- .element class="fragment" data-fragment-index="4"--> *Exemples* :
- <!-- .element class="fragment" data-fragment-index="4"--> Galaxy, Kepler, Taverna, Pegasus, Collective Knowledge, VisTrails
- <!-- .element class="fragment" data-fragment-index="4"--> Légers :
dask, drake, swift, snakemake, ...
- <!-- .element class="fragment" data-fragment-index="4"--> Hybrides :
SOS-notebook, ...
Note:
- un workflow, c'est quoi ? On restructure le code de façon à rendre
le flot de traitement plus explicite. Chaque bout de code est
encapsulé dans une fonction, on supprime les effets de bord pour que
les entrées et les sorties soient parfaitement identifiées. On
connecte ensuite chacune de ces fonctions les unes avec les
autres.
- Un environnement de workflow fournit les bonnes abstractions, les
bonnes conventions d'écritures permettant d'orchestrer tous ces
appels et c'est ensuite le moteur de workflow qui gère l'exécution
des choses. Non seulement le workflow peut plus facilement exploiter
une machine parallèle, mais en plus, il est possible de sauvegarder
l'état d'avancement du calcul (via les données générées jusqu'ici)
et le reprendre plus tard. Si on décide de modifier une des briques
du workflow, on peut réutiliser les résultats obtenus en amont. Ce
genre de manipulation est bien plus compliquée avec un notebook où
il y a une session, un état global et où le risque d'erreur est bien
plus important.
- Alors, un workflow peut devenir quelque chose de très compliqué et
de pas forcément très clair non plus mais la représentation par un
graphe permet de regrouper et d'agréger certaines parties pour se
concentrer sur l'essentiel tout en pouvant inspecter les détails
quand on le souhaite.
- Un autre avantages du workflow est la capacité à partager des
parties du workflow avec d'autres et à bénéficier des améliorations
que d'autres pourraient apporter à notre propre workflow... C'est un
des intérêt de plates-formes comme taverna ou kepler.
- Le notebook est donc selon moi parfait quand on met quelque chose au
point car il permet de prendre des notes sur ce que l'on fait
et sur pourquoi on le fait. Au fur et à mesure que le notebook
évolue en quelque chose de plus complexe et qu'on a les idées de
plus en plus claires sur les manipulations de données à effectuées,
il devient intéressant de transformer toute cette matière en un
workflow.
- Cette restructuration est manuelle et il n'existe pas encore de
bonne solution pour passer de l'un à l'autre. Il y a des tentatives
intéressantes comme le sos-notebook dans Jupyter mais toutes ces
initiatives sont encore en plein développement.
- L'utilisation d'un workflow ne rend pas l'utilisation d'un notebook
caduque. Le notebook est utile mais à un autre niveau. Les appels au
workflow peuvent parfaitement être faits à partir du notebook et on
utilisxe alors ce dernier pour décrire les expériences que l'on mène
et le résultats des analyses.
** L'usine à gaz des calculs coûteux
Les *calculs interminables* et les *gros volumes de données*
- JupyterHub et les supercalculateurs : en développement
<br/>
- Checkpoint et Cache
<br/>
- Le workflow permet de passer à l'échelle
Note:
# https://zonca.github.io/2015/04/jupyterhub-hpc.html
# https://github.com/ipython/ipyparallel/issues/167
# https://groups.google.com/forum/#!topic/jupyter/BlexhV8W5TE
Les calculs interminables et les gros volumes de données
- JupyterHub et les supercalculateurs: en développement
- Lancement sur des machines distantes ? Compliqué, pas de bonnes
solutions à l'heure actuelle.
- Actuellement, JupyterHub permet de donner une machine
(éventuellement virtuelle) à chaque notebook
- Il dispose également d'un onglet cluster permettant d'allouer
plusieurs machines à un Ipython parallèle.
- Lorsque l'on souhaite paralléliser c'est la plupart du temps le
langage du notebook qui fait le travail (Ipython parallèle, R au
dessus de spark, etc.), pas le notebook lui même.
- Notebook idéal selon moi: tel bloc peut/doit s'exécuter ailleurs
- Ce qui n'est pas sans poser de nombreux problèmes de sémantiques
(surtout si le mécanisme de session est utilisé et/ou que
plusieurs langages sont utilisés)
- Checkpoint et Cache:
- Il y a des mécanismes de cache dans les trois environnements que
nous vous avons présentés.
- Cela vous permet de ne pas tout réexécuter depuis le début.
- Ne pas confondre l'objet résultant (le graphique ou le tableau) des
données sous-jacentes.
- Un checkpoint explicite (via des fichiers) des données nécessaires
à la suite des calculs est la méthode la plus simple.
- Le workflow gère la séparation des codes et des données, ce qui
permet de passer à l'échelle
# - Histoire de montrer que malgré ça c'est dur:
# https://github.com/IFB-ElixirFr/ReproHackathon/blob/master/docs/index.md
# https://f1000research.com/articles/6-124/v1
** Des éco-systèmes complexes
Que se cache-t-il derrière ce simple
#+begin_src python :results output :exports both
import matplotlib
#+end_src
#+BEGIN_EXPORT html
<pre><code data-fragment-index="1" class="fragment current-visible">Package: python3-matplotlib
Version: 2.1.1-2
Depends: python3-dateutil, python-matplotlib-data (>= 2.1.1-2),
python3-pyparsing (>= 1.5.6), python3-six (>= 1.10), python3-tz,
libjs-jquery, libjs-jquery-ui, python3-numpy (>= 1:1.13.1),
python3-numpy-abi9, python3 (<< 3.7), python3 (>= 3.6~),
python3-cycler (>= 0.10.0), python3:any (>= 3.3.2-2~), libc6 (>=
2.14), libfreetype6 (>= 2.2.1), libgcc1 (>= 1:3.0), libpng16-16 (>=
1.6.2-1), libstdc++6 (>= 5.2), zlib1g (>= 1:1.1.4)
</code>
<img src="assets/img/python3-matplotlib.png" height=600 data-fragment-index="2" class="fragment current-visible"/>
</pre>
#+END_EXPORT
Note:
- Qu'est-ce qui se cache derrière matplotlib
- Python peut nous dire ce qu'il en sait (i.e., pas grand chose)
mais comment s'assurer que deux personnes exécutent bien ce code
dans le même environnement logiciel
- Dans le cadre de ce MOOC, un serveur jupyter est déployé et un
environnemnt commun est proposé. Mais pouvez vous vous assurer que
vous disposerez du même environnemnt chez vous à la fin du MOOC ?
- Comment réinstaller un tel environnemnent ? Comment packager un
logiciel complexe ?
- Comment faire en sorte qu'il puisse évoluer si un bug est corrigé ?
** Des éco-systèmes complexes
<span style="font-size:30px">Pas de standard</span>
- <!-- .element style="font-size:25px" --> Linux (=apt=, =rpm=, =yum=),
MacOS X (=brew=, =McPorts=, =Fink=), Windows (?)
- <!-- .element style="font-size:25px" --> Ni pour l'installation ni pour récupérer les informations... \frowny
#+BEGIN_EXPORT html
<div class='left' style='float:left;width:40%'>
<pre style="font-size:15px"><!-- <code class="lang-python hljs"><span class="line" style="font-size:20px"> -->
#+END_EXPORT
#+begin_src python :results output :exports both
import sys
print(sys.version)
import matplotlib
print(matplotlib.__version__)
import pandas as pd
print(pd.__version__)
#+end_src
#+RESULTS:
: 3.6.3 (default, Oct 3 2017, 21:16:13)
: [GCC 7.2.0]
: 2.1.1
: 0.20.3
#+BEGIN_EXPORT html
<!-- </span></code> --></pre>
</div>
<div class='right' style='float:right;width:60%'>
<pre style="font-size:15px"><!-- <code class="lang-r hljs"><span class="line"> -->
#+END_EXPORT
#+begin_src R :results output :session *R* :exports both
library(ggplot2)
sessionInfo()
#+end_src
#+RESULTS:
#+begin_example
R version 3.4.3 (2017-11-30)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Debian GNU/Linux buster/sid
Matrix products: default
BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.7.1
LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.7.1
locale:
[1] LC_CTYPE=fr_FR.UTF-8 LC_NUMERIC=C
[3] LC_TIME=fr_FR.UTF-8 LC_COLLATE=fr_FR.UTF-8
[5] LC_MONETARY=fr_FR.UTF-8 LC_MESSAGES=fr_FR.UTF-8
other attached packages:
[1] ggplot2_2.2.1
loaded via a namespace (and not attached):
[1] colorspace_1.3-2 scales_0.5.0 compiler_3.4.3 lazyeval_0.2.1
[5] plyr_1.8.4 pillar_1.1.0 gtable_0.2.0 tibble_1.4.2
[9] Rcpp_0.12.15 grid_3.4.3 rlang_0.1.6 munsell_0.4.3
#+end_example
#+BEGIN_EXPORT html
<!-- </span></code> --></pre>
</div>
#+END_EXPORT
Note:
- Pas de standard:
- Ni pour l'installation ni pour récupérer les informations:
- Linux (Debian =apt=, RedHat =rpm=, ...), MacOS X (=brew=, =McPorts=,
=Fink=), Windows (?)
- Indiquer ses dépendances logicielles, c'est la version 0 de la
reproductibilité. Ça ne coûte pas bien cher et ça permettra à
celui qui viendra après vous de savoir par où commencer.
- Il faut mettre en place une solution ad hoc, selon le langage
utilisé et ce n'est pas simple.
- Lister l'intégralité de ses dépendances logicielles (voire avec
quel compilateur telle bibliothèque a été compilée) peut être très
compliqué
** Contrôler son environnement
*Un environnement contrôlé :*
- Travailler dans une machine virtuelle (lourd) ou un conteneur docker
(léger)
#+BEGIN_EXPORT html
</br>
<div class='left' style='float:left;width:50%'>
**Conserver le bazar**
<ul>
<li> Capture automatique de l'environnement
<li> <a href="http://www.pgbovine.net/cde.html">CDE</a>,
<a href="https://vida-nyu.github.io/reprozip/">ReproZip</a>,
<a href="http://reproducible.io/"><strike>CARE</strike></a>
</ul>
</div>
<div class='right' style='float:right;width:50%'>
**Faire le ménage**
<ul>
<li> Partir d'un environnement vierge
<li> Installer uniquement le nécessaire (et l'expliciter)
<li> <a href="https://www.docker.io/">Docker</a>/<a href="https://singularity.lbl.gov/">Singularity</a>, <a href="https://www.gnu.org/software/guix/">Guix</a>/<a href="https://nixos.org/">Nix</a>, ...
<ul>
</div>
#+END_EXPORT
Note:
- Intro:
- You cannot expect people to find all the chains of dependencies!
- You cannot expect people to install all the dependencies and run your
code smoothly!
- Règle numéro 1 d'un environnement bien contrôlé: travailler dans un
environnement isolé (une machine virtuelle ou bien un conteneur)
- Brève explication de ce que c'est et de la différence. Sans le
savoir, tous ceux qui ont utilisé nos notebooks ont travaillé dans
un conteneur docker.
- Conséquence:
- du point de vue du code exécuté, tout est encapsulé: rien ne
rentre, rien ne sort
- l'utilisation de l'interface graphique peut être un peu compliquée
- exécution a priori possible sur n'importe quel OS (pour une VM,
sur un OS compatible pour un conteneur)
- Un environnement contrôlé: deux approches
- Conserver le bazar ::
- C'est l'approche toute automatique, un outil se charge
d'observer l'exécution de votre logiciel et de capturer
l'ensemble des codes et des bibliothèques utilisées
- Une archive contenant l'environnement peut alors être construite
et partagée. C'est très facile et très pratique.
- Avantage: Facile, permet à quelqu'un d'autre de réexécuter le
code dans les mêmes conditions
- Inconvénient: pas facile de faire évoluer un tel objet, ni de
comprendre comment il fonctionne. Le résultat est une boite
noire.
- Examples: CARE, CDE, Reprozip
- Faire le ménage ::
- On part d'un environnement minimal dans un conteneur
- On rajoute les composants logiciel dont on a besoin au fur et à
mesure
- Idéalement, au fur et à mesure qu'on rajoute ces logiciel, on
scripte leur installation (e.g., dockerfile)
- Avantage: cela permettra de facilement faire évoluer
l'environnement (mise à jour, remplacement d'un composant
défectueux, etc.)
- Inconvénient: demande quelques efforts, en particulier quand les
composants logiciels sont mal packagés (pas partie d'une
distribution, interventions manuelles, etc.) et que beaucoup
d'interactions avec l'extérieur sont nécessaires (le téléchargement
des données doit être bien séparé)
- Examples: Singularity, voire Nix ou GUIX qui permettent une
reconstruction parfaite, un environnement étant encodé de façon
fonctionnel
*** Cruft :noexport:
#+begin_src shell :results output raw :exports both
echo "#+BEGIN_EXAMPLE"
apt-cache show python3-matplotlib # | grep Depends | head -1
echo "#+END_EXAMPLE"
#+end_src
#+RESULTS:
#+BEGIN_EXAMPLE
Package: python3-matplotlib
Source: matplotlib
Version: 2.1.1-2
Installed-Size: 12159
Maintainer: Sandro Tosi <morph@debian.org>
Architecture: amd64
Depends: python3-dateutil, python-matplotlib-data (>= 2.1.1-2), python3-pyparsing (>= 1.5.6), python3-six (>= 1.10), python3-tz, libjs-jquery, libjs-jquery-ui, python3-numpy (>= 1:1.13.1), python3-numpy-abi9, python3 (<< 3.7), python3 (>= 3.6~), python3-cycler (>= 0.10.0), python3:any (>= 3.3.2-2~), libc6 (>= 2.14), libfreetype6 (>= 2.2.1), libgcc1 (>= 1:3.0), libpng16-16 (>= 1.6.2-1), libstdc++6 (>= 5.2), zlib1g (>= 1:1.1.4)
Recommends: python3-pil, python3-tk
Suggests: dvipng, ffmpeg, gir1.2-gtk-3.0, ghostscript, inkscape, ipython3, librsvg2-common, python-matplotlib-doc, python3-cairocffi, python3-gi, python3-gi-cairo, python3-gobject, python3-nose, python3-pyqt4, python3-scipy, python3-sip, python3-tornado, texlive-extra-utils, texlive-latex-extra, ttf-staypuft
Enhances: ipython3
Description-fr: système de traçage basé sur Python dans un style similaire à celui Matlab –⋅Python⋅3
Matplotlib est une bibliothèque de traçage en Python pur conçue pour
apporter à Python des capacités de traçage d'une qualité adaptée à la
publication, avec une syntaxe familière aux utilisateurs de Matlab. L'accès
à toutes les commandes de traçage, dans l'interface pylab, est possible
soit à travers une interface fonctionnelle familière aux utilisateurs de
Matlab, soit à travers une interface orientée objet familière à ceux de Python.
.
Ce paquet fournit la version Python⋅3 de matplotlib.
Description-md5: 29e115db1f22ec2264a195b584329de9
Homepage: http://matplotlib.org/
Section: python
Priority: optional
Filename: pool/main/m/matplotlib/python3-matplotlib_2.1.1-2_amd64.deb
Size: 4597588
MD5sum: bfca8169a6b4e2cd9f89eb2f862083c7
SHA256: cbf80fdbf2643f19f926e33ea24cab3f76286d631d0806a2f665989fb17c76e4
Package: python3-matplotlib
Source: matplotlib
Version: 2.0.0+dfsg1-2
Installed-Size: 7362
Maintainer: Sandro Tosi <morph@debian.org>
Architecture: amd64
Depends: python3-dateutil, python-matplotlib-data (>= 2.0.0+dfsg1-2), python3-pyparsing (>= 1.5.6), python3-six (>= 1.10), python3-tz, libjs-jquery, libjs-jquery-ui, python3-numpy (>= 1:1.10.0~b1), python3-numpy-abi9, python3 (<< 3.6), python3 (>= 3.5~), python3-cycler (>= 0.10.0), python3:any (>= 3.3.2-2~), libc6 (>= 2.14), libfreetype6 (>= 2.2.1), libgcc1 (>= 1:3.0), libpng16-16 (>= 1.6.2-1), libstdc++6 (>= 5.2)
Recommends: python3-pil, python3-tk
Suggests: dvipng, ffmpeg, gir1.2-gtk-3.0, ghostscript, inkscape, ipython3, librsvg2-common, python-matplotlib-doc, python3-cairocffi, python3-gi, python3-gi-cairo, python3-gobject, python3-nose, python3-pyqt4, python3-scipy, python3-sip, python3-tornado, texlive-extra-utils, texlive-latex-extra, ttf-staypuft
Enhances: ipython3
Description-fr: système de traçage basé sur Python dans un style similaire à celui Matlab –⋅Python⋅3
Matplotlib est une bibliothèque de traçage en Python pur conçue pour
apporter à Python des capacités de traçage d'une qualité adaptée à la
publication, avec une syntaxe familière aux utilisateurs de Matlab. L'accès
à toutes les commandes de traçage, dans l'interface pylab, est possible
soit à travers une interface fonctionnelle familière aux utilisateurs de
Matlab, soit à travers une interface orientée objet familière à ceux de Python.
.
Ce paquet fournit la version Python⋅3 de matplotlib.
Description-md5: 29e115db1f22ec2264a195b584329de9
Homepage: http://matplotlib.org/
Section: python
Priority: optional
Filename: pool/main/m/matplotlib/python3-matplotlib_2.0.0+dfsg1-2_amd64.deb
Size: 1589544
MD5sum: e8f0571243df303a9b1f37a8ebf8177d
SHA256: 8f5d3509d4f5451468c6de44fc8dfe391c3df4120079adc01ab5f13ff4194f5a
#+END_EXAMPLE
<!-- .slide: class="center" --> Pourquoi est-ce difficile ?
** <!-- .slide: class="center" --> L'épreuve du temps file:assets/img/soviet_space_shuttle.jpg&size=cover
** Compatibilité ascendante
- Python et tout son écosystème à évolution hyper rapide
#+begin_src shell :results output :exports both
python2 -c "print(10/3)"
python3 -c "print(10/3)"
#+end_src
#+RESULTS:
: 3
: 3.3333333333333335
#+HTML: <img src="assets/img/plot_1.5.3.png" height=240 data-fragment-index="2" class="fragment current-visible"/>
#+HTML: <img src="assets/img/plot_1.5.3.png" height=240 data-fragment-index="3" class="fragment current-visible"/>
#+HTML: <img src="assets/img/plot_2.1.1.png" height=240 data-fragment-index="3" class="fragment current-visible"/>
 
- <!-- .element class="fragment" data-fragment-index="4"--> <span
style="font-size:30px"> Cortical Thickness Measurements (PLOS ONE,
June 2012): /FreeSurfer/: /differences were found between the Mac and
HP workstations and between Mac OSX 10.5 and OSX 10.6./
- <!-- .element class="fragment" data-fragment-index="5"-->
Incompatibilité de formats entre orgmode 7.*, 8.*, 9.*, etc.
Note:
- Petit exemple en python, le plus simple qui soit, une division:
- Le passage de python2 à python3 a introduit des changements
majeurs puisque la division par défaut qui était à l'origine une
division entière est devenue une division sur des flottants.
- Alors, certains diront que python2 et python3 doivent être
considérés comme deux langages distincts mais même si python2
reste maintenu et continue d'évoluer (doucement), quand tous les
efforts de l'écosystème se tournent vers python3, on est bien
obligé d'emboiter le pas...
- Il y a quelques mois, un de mes collègues qui était bien content
d'avoir utilisé un notebook pour préparer son dernier article et
d'avoir fait bien attention à sauvegarder tout son code et ses
résultats intermédiaires, a été assez surpris en préparant la
révision finale de remarquer que la figure qu'il avait générée 3
mois auparavant avait décidé de changer de couleurs...
- Entre les deux, matplotlib a été mis à jour sur sa machine et il
se trouve qu'entre la version 1.5.12 et la 2.0, la palette de
couleurs par défaut a changé...
- Alors, dans cet exemple précis, ça ne change pas
fondamentalement les choses et le plus important était de
pouvoir mettre à disposition la démarche utilisée mais c'est
quand même assez agaçant.
- Ce type d'incident met en évidence le problème de la perméabilité
à l'environnement extérieur.
** Les outils à développement rapide
*Rapides*, mais *fragiles* et *peu pérennes* :
#+BEGIN_EXPORT html
<ul>
<li>Correction ou introduction de bug
<li>Il devient nécessaire de vérifier régulièrement la
reconstructibilité et la fonctionnalité de ces environnements
(intégration continue et tests de non régression)<br/>
Popper: <http://falsifiable.us/> <img src="https://raw.githubusercontent.com/systemslab/popper/gh-pages/images/popper_logo_just_jug.png" height=100/>
</ul>
#+END_EXPORT
*Autre possibilité* :
- Se restreindre à ce qui est maîtrisable (C par exemple)
Note:
- Les outils informatiques évoluent à une vitesse incroyable et nous
permettent d'aller plus vite, plus loin dans nos recherche. Il est
donc indispensable de s'appuyer dessus.
- Néanmoins, ces développements rapides sont aussi a source de
nombreuses erreurs, de régressions, de corrections (ce qui est une
bonne chose) et très souvent de perte de compatibilité entre les
versions.
- Ce sont des outils à développement rapide dans les deux sens du
terme, c'est à dire des outils qui à la fois vous permettent de
mettre en place des choses complexes très rapidement mais qui
évoluent aussi très (pour ne pas dire trop) rapidement.
- Dans ce contexte mouvant, il devient nécessaire de vérifier
régulièrement que notre code et son environnement peuvent être
regénérés et qu'ils sont fonctionnels. En génie logiciel, les termes
associés sont "intégration continue" (chaque nuit ou bien à chaque
commit dans votre gestionnaire de version, la compilation de votre
code est déclenchée et remonte une alerte en cas de problème) et
"tests de non régression" (une fois votre code et son environnement
compilé, on vérifie via une batterie de tests que les sorties pour
des entrées bien spécifiques sont toujours correctes).
- Certains proposent même une utilisation systématique de ce type
d'approche au processus de recherche. Ça demande un investissement
technique un peu lourd mais dans le principe, pourquoi pas ?
- Il faut garder à l'esprit que les notebooks ou les outils que nous
vous avons présentés font d'ailleurs partie de cette famille
d'outils à développement rapide et n'échappent pas malgré leurs
efforts à ces difficultés de pérennité.
- Pour être le moins possible ennuyé par ce type de problème, certains
font le choix de se restreindre à des outils et des langages très
stables et qu'ils peuvent maîtriser de bout en bout.
- Il faut donc trouver le bon compromis entre modernisme et pérennité.
** L'archivage
*Gestion du code source* <!-- .element class="fragment" data-fragment-index="1"-->
- <!-- .element class="fragment" data-fragment-index="1"--> Git (hub, lab, ...) : stables, ouverts, \dots pérennes ?
- <!-- .element class="fragment" data-fragment-index="1"--> <strike>Google Code</strike>, <strike>Gitorious</strike>, <strike>Code Spaces</strike>
<br><img src="assets/img/swh-logo.png" height=100 />
<img src="assets/img/LogoHAL.PNG" height=80 />
*Gestion des environnements* <!-- .element class="fragment" data-fragment-index="2"-->
- <!-- .element class="fragment" data-fragment-index="2"--> Pérénité de l'accès à dockerhub, nix repository, code ocean, ... ?
- <!-- .element class="fragment" data-fragment-index="2"--> Une fois l'environnement gelé, quelle est la pérennité d'une VM,
d'une image docker, ... ?
*Conserver le plus d'informations possible en automatisant* <!-- .element class="fragment" data-fragment-index="3"-->
- <!-- .element class="fragment" data-fragment-index="3"-->
Logiciels, versions, procédure d'installation
Note:
- Dans les exercices, faites y bien attention.
# <img src="assets/img/ArXiv-web.png" height=60 />
# <img src="assets/img/Zenodo-logo.jpg" height=60 />
# <img src="assets/img/Figshare-logo.png" height=60 />
* C028AL-W2-S3 (\approx 10:00); L'enfer du calcul
** Vers une étude reproductible : la réalité du terrain
_Module 4. Vers une étude reproductible : la réalité du terrain_
1. L'enfer des données
2. L'enfer du logiciel
3. *L'enfer du calcul*
4. Conclusion
#+BEGIN_EXPORT html
Note:
Dans cette séquence, nous montrons les difficultés spécifiques qu'on
rencontre dans le calcul numérique. La plus fréquente est due à
l'arithmétique à virgule flottante, ce qui est un cas spécial de la
variabilité entre les plateformes de calcul. Une autre difficulté
est due aux générateurs de nombres aléatoires.
+++
## L'arithmétique à virgule flottante
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/polynome1.svg" style="width:70%; margin-top: none; border: none; background: none; box-shadow: none;" />
```
def polynome(x):
return x**9 - 9.*x**8 + 36.*x**7 - 84.*x**6 + 126.*x**5 \
- 126.*x**4 + 84.*x**3 - 36.*x**2 + 9.*x - 1.
```
Note:
Commençons avec un exemple. Mon collègue Arnaud a calculé les valeurs d'un
polynôme d'ordre 9. Le voici.
+++
## L'arithmétique à virgule flottante
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/polynome2.svg" style="width:70%; margin-top: none; border: none; background: none; box-shadow: none;" />
```
def horner(x):
return x*(x*(x*(x*(x*(x*(x*(x*(x - 9.) + 36.) - 84.) + 126.) \
- 126.) + 84.) - 36.) + 9.) - 1.
```
Note:
Mon collègue Christophe lui fait remarquer que la méthode de Horner résulte dans
un calcul plus efficace. Il s'agit d'un réarrangement des termes qui reduit notamment
le nombre de multiplications. Le voici. Les deux courbes se recouvrent, donc les
résultats sont identiques.
+++
## L'arithmétique à virgule flottante
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/polynome3.svg" style="width:70%; margin-top: none; border: none; background: none; box-shadow: none;" />
```
def simple(x):
return (x-1.)**9
```
Note:
Une analyse un peu plus approfondie montre que notre polynôme a une seule racine
à x=1, ce qui nous permet d'en simplifier le calcul. Nous avons maintenant
trois courbes qui se recouvrent. Tout va bien !
+++
## L'arithmétique à virgule flottante
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/polynome3-4.svg" style="width:70%; margin-top: none; border: none; background: none; box-shadow: none;" />
Note:
Mais regardons la région autour de x=1 de plus près...
+++
## L'arithmétique à virgule flottante
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/polynome4.svg" style="width:70%; margin-top: none; border: none; background: none; box-shadow: none;" />
Note:
Ça a l'air un peu bizarre. Et les trois courbes ne sont enfin pas identiques,
juste proches. Qu'est-ce qui se passe ?
+++
## L'arrondi
<ul>
<li>Il y a un arrondi implicite dans chaque opération.</li>
<li class="fragment">a+b est en réalité *arrondi*(a+b).</li>
<li class="fragment">Mais *arrondi*(*arrondi*(a+b)+c) ≠ *arrondi*(a+*arrondi*(b+c)).</li>
<li class="fragment">L'ordre des opérations est donc important.</li>
</ul>
<p class="fragment"> **Pour un calcul reproductible,<br /> il faut préserver l'ordre des opérations&emsp14;!!**</p>
Note:
Le résultat d'une opération arithmétique sur des flottant n'est en général pas
représentable par un autre flottant. On applique une opération d'arrondi qui
remplace le résultat exact avec une valeur proche qui est représentable.
A cause de l'arrondi, les règles habituelles de l'arithmétique ne sont plus
applicables à l'identique. On perd notamment l'associativité de l'addition et
de la multiplication.
En changeant l'ordre des opérations, on peut donc changer le résultat !
+++
## Comment l'expliquer à mon compilateur&emsp14;?
Pour accélérer le calcul, les compilateurs peuvent changer l'ordre des opérations,
et donc le résultat.
<p class="fragment">
Pour un calcul reproductible, il y a deux approches&emsp14;:</p>
<ul>
<li class="fragment">
Insister sur le respect de l'ordre des opérations, <br >
&emsp14;si le langage le permet.<br />
&emsp14;Exemple&emsp14;: Le module `ieee_arithmetic` en Fortran 2003 <br />
<br /></li>
<li class="fragment">
Rendre la compilation reproductible&emsp14;:<br />
- Noter la version précise du compilateur<br />
- Noter toutes les options de compilation</li>
</ul>
Note:
Ceci devient un obstacle à la reproductibilité à cause des
optimisations appliquées par les compilateurs pour accélérer le
calcul. Celle-ci changent souvent l'ordre des opérations et donc le
résultat.
Pour rendre un calcul reproductible, il y a deux
approches. Premièrement, on peut dire à son compilateur de ne pas
toucher à l'ordre des opérations, idéalement dans le code source du
logiciel. Ceci est possible par exemple dans le langage Fortran
2003.
L'autre approche est de rendre la compilation elle-même
reproductible en notant la version précise du compilateur utilisé,
ainsi que toutes les options de compilation. Idéalement, il faut
alors archiver le compilateur avec le logiciel de calcul.
+++
## Calcul parallèle
<ul>
<li> Objectif&emsp14;: une exécution plus rapide <br />
⟶ Minimiser la communication entre processeurs <br />
⟶ Adapter la répartition des données... <br />
⟶ et donc l'ordre des opérations <br />
<br /> </li>
<li class="fragment"> Conséquence&emsp14;: le résultat dépend du nombre de processeurs&emsp14;! </li>
</ul>
<p class="fragment"> **Minimiser cet impact du parallélisme<br /> reste un sujet de recherche.**</p>
Note:
Un autre obstacle à la reproductibilité résulte du calcul parallèle.
Celui-ci a comme seul objectif une exécution plus rapide. Pour y arriver,
il faut minimiser la communication entre les processeurs en adaptant
la répartition des données. Ceci implique d'adapter l'ordre des opérations,
car chaque processeur traite d'abord ses données locales avant d'entrer en
communication avec les autres processeurs.
La conséquence est que le résultat du calcul change avec le nombre
de processeurs utilisés.
On peut tenter d'écrire le logiciel tel que l'impact de cette variation
soit minimisé. Mais il n'y a pour l'instant aucune technique éprouvée
pour y arriver. Ceci reste un sujet de recherche.
+++
## Calcul parallèle&emsp14;: exemple
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/gouttedo1.png" style="width:100%; margin-top: none; border: none; background: none; box-shadow: none;" />
<font size="5">(Source&emsp14;: Thèse de Rafife Nheili, Université de Perpignan, 2016)</font>
Note:
Regardons un simple exemple: la simulation des vagues causées dans
un bassin carré d'eau par une goutte qui tombe au milieu. A gauche,
la simulation exécutée sur un seul processeur. A droite, le résultat
d'un calcul sur quatre proecesseurs, ou les points qui diffèrent
sont colorés en gris.
+++
## Calcul parallèle&emsp14;: exemple
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/gouttedo2.png" style="width:100%; margin-top: none; border: none; background: none; box-shadow: none;" />
<font size="5">(Source&emsp14;: Thèse de Rafife Nheili, Université de Perpignan, 2016)</font>
Note:
Un pas de temps plus loin, le nombre de points à résultat différent
a nettement augmenté. Il continuera a augmenter au cours de la
simulation, jusqu'à ce qu'il n'y a plus aucun point pour lequel le
résultat restera identique.
+++
## Les plateformes de calcul
<ul>
<li>Plateforme de calcul&emsp14;: matériel + infrastructure logicielle</li>
<li class="fragment">Calcul = plateforme + logiciel + données </li>
<li class="fragment">La plateforme définit l'interprétation du logiciel.</li>
<li class="fragment">Plateforme et logiciel définissent l'interprétation des données.</li>
<li class="fragment">Autres aspects définis par la plateforme&emsp14;:<br />
- la représentation des entiers (16/32/64 bits)<br />
- la gestion des erreurs</li>
</ul>
Note:
Les obstacles à la reproductibilité dûs à l'arithmétique à virgule flottante
sont un cas spécial important de la dépendance des plateformes. Un logiciel
est écrit dans un langage de programmation, mais l'interprétation précise de
ce langage est définie par la plateforme de calcul utilisé. Celle-ci consiste
du matériel, notamment du processeur, et de l'infrastructure logiciel:
système d'exploitation, compilateurs, etc.
Un calcul est défini par trois ingrédients: la plateforme, le logiciel, et les
données traitées. La plateforme définit comment est interprété le logiciel,
et les deux ensembles définissent comment sont interprétées les donées.
L'arithmétique à virgule flottante est interprétée différemment par les différentes
plateformes de calcul populaires aujourd'hui, mais ce n'est pas le seul point
de divergence. Dans certains langage comme le C ou le Fortran, les entiers sont
aussi concernés car les plateformes leur attribuent des tailles et donc des
intervalles de valeurs différentes. Enfin, les erreurs de calcul, comme par
exemple la division par zéro, ne sont pas gérées de la ême façon par toutes les
plateformes.
+++
## Les nombres aléatoires
<ul>
<li> Utilisés pour simuler les processus stochastiques.<br />
<br /></li>
<li class="fragment"> En pratique&emsp14;: nombres **pseudo-**aléatoires.<br />
<br /></li>
<li class="fragment"> Suite de nombres **en apparence** aléatoires...<br />
<br /></li>
<li class="fragment">... mais générés par un algorithme déterministe.<br />
<br /></li>
</ul>
+++
## Générateur de nombres pseudo-aléatoires
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/nombres-aleatoires-1.svg" style="width:70%; margin-top: none; border: none; background: none; box-shadow: none;" class="fragment current-visible" />
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/nombres-aleatoires-2.svg" style="width:70%; margin-top: none; border: none; background: none; box-shadow: none;" class="fragment current-visible" />
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/nombres-aleatoires-3.svg" style="width:70%; margin-top: none; border: none; background: none; box-shadow: none;" class="fragment current-visible" />
<img src="https://rawgit.com/alegrand/RR_MOOC/master/assets/img/nombres-aleatoires-4.svg" style="width:70%; margin-top: none; border: none; background: none; box-shadow: none;" class="fragment current-visible" />
Note:
On part d'un état initial appelé "graine" (typiquement un entier).
Pour générer un nombre, on applique une transformation à cet état,
puis on calcule le nombre comme fonction de cet état.
On repète autant que nécessaire.
+++
## La reproductibilité en théorie
<ul>
<li> Principe&emsp14;: même graine + même algorithme → même suite<br />
<br /></li>
<li class="fragment"> La graine est souvent choisie comme fonction de l'heure<br />
<br /></li>
<li class="fragment"> Il faut la définir dans le code d'application<br />
<br /></li>
<ul>
Note:
En principe, il suffit d'utiliser la même graine et le même algorithme pour
toujours avoir la même suite de nombres.
L'algorithme fait partie d'une librairie, dont il faut noter la version
utilisée. Les librairie de nombres aléatoires choisissent souvent la graine
comme fonction de l'heure, pour donner une apparence "plus aléatoire".
Mais pour la reproductibilité, il faut définir la graine dans le code
d'application.
+++
## La reproductibilité en pratique
<ul>
<li> Même graine + même algorithme → même suite&emsp14;: <br />
&emsp14;pas évident en arithmétique à virgule flottante&emsp14;! <br />
<br /></li>
<li class="fragment">
Un astuce simple pour permettre la vérification&emsp14;: <br />
&emsp14;tester quelques valeurs du début de la suite.</li>
</ul>
Note:
En pratique, il n'est pas si facile d'obtenir une suite identique, même avec
la même version de la même librairie, à cause de la variation dans l'arithmétique
à virgule flottante.
Un astuce simple est de tester quelques valeurs du début de la suite. Si elle ne
sont pas identiques, on sait que la suite a changé.
+++
## Exemple&emsp14;: le langage Python
```
import random
random.seed(123)
for i in range(5):
print(random.random())
```
```
0.052363598850944326
0.08718667752263232
0.4072417636703983
0.10770023493843905
0.9011988779516946
```
Note:
Voici l'application de cet astuce en langage Python. On commence par
définir la graine et d'afficher les premières valeurs de la suit de
nombres pseudo-aléatoires.
+++
## Exemple&emsp14;: le langage Python
```
import random
random.seed(123)
assert random.random() == 0.052363598850944326
assert random.random() == 0.08718667752263232
assert random.random() == 0.4072417636703983
```
Note:
Puis on modifie le code en remplaçant l'affichage des valeurs par des
comparaisons aux valeurs précédemment affichées. En cas de divergence,
le programme s'arrête avec un message d'erreur.
+++
## Les points clés à retenir
<ul>
<li>Les résultats d'un calcul dépendent <br />
- du logiciel<br />
- des données d'entrée<br />
- de la plateforme de calcul&emsp14;: matériel, compilateurs, ... </li>
<li class="fragment">L'influence de la plateforme est importante pour l'arithmétique à virgule flottante.</li>
<li class="fragment"> Notez les paramètres dont peuvent dépendre vos résultats&emsp14;: <br />
- version du compilateur, options de compilation <br />
- matériel (type de processeur, GPU, ...) <br />
- nombre de processeurs </li>
<li class="fragment">En utilisant un générateur de nombres aléatoires, définissez la graine et vérifiez les premiers éléments de la suite.</li>
</ul>
#+END_EXPORT
* C028AL-W2-S4 (\approx 2:00); Conclusion
** Vers une étude reproductible : la réalité du terrain
_Module 4. Vers une étude reproductible : la réalité du terrain_
1. L'enfer des données
2. L'enfer du logiciel
3. L'enfer du calcul
4. *Conclusion*
** Ce qu'il faut retenir de ce MOOC
*Un véritable enjeu* <!-- .element class="fragment" data-fragment-index="1"-->
- <!-- .element class="fragment" data-fragment-index="1" style="font-size:30px" --> Méthodologie scientifique
- <!-- .element class="fragment" data-fragment-index="1" style="font-size:30px" --> Inspectabilité et réutilisation
*Des outils existent* <!-- .element class="fragment" data-fragment-index="2"-->
- <!-- .element class="fragment" data-fragment-index="2" style="font-size:30px" -->Documents computationnels et Workflows, Suivi de version et
Archives, Environnements logiciels, Intégration continue, ...
- <!-- .element class="fragment" data-fragment-index="2" style="font-size:30px" --> Ces outils évoluent en permanence
- <!-- .element class="fragment" data-fragment-index="2" style="font-size:30px" --> Choisissez ceux qui sont les plus adaptés à votre contexte
- <!-- .element class="fragment" data-fragment-index="2" style="font-size:30px" --> Cherchez un compromis entre modernisme et pérénité
*Mettez en pratique, ne vous découragez pas!* <!-- .element class="fragment" data-fragment-index="3"-->
- <!-- .element class="fragment" data-fragment-index="3" style="font-size:30px" --> Prenez des notes rigoureusement
- <!-- .element class="fragment" data-fragment-index="3" style="font-size:30px" --> Rendez l'information exploitable et accessible
- <!-- .element class="fragment" data-fragment-index="3" style="font-size:30px" --> Améliorez petit à petit
#+TITLE: The Rough Road to Real-Life Reproducible Research
#+AUTHOR: @@latex:Christophe Pouzat, Arnaud Legrand, Konrad Hinsen@@
#+LATEX_CLASS: beamer
#+LATEX_CLASS_OPTIONS: [presentation,bigger,xcolor={usenames,dvipsnames,svgnames,table}]
#+STARTUP: beamer indent
#+LANGUAGE: fr
#+PROPERTY: header-args :eval no-export
#+OPTIONS: H:2 tags:nil
#+OPTIONS: num:t toc:nil \n:nil @:t ::t |:t ^:nil -:t f:t *:t <:t
#+OPTIONS: TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-toc
# #+OPTIONS: author:nil email:nil creator:nil timestamp:t
#+TAGS: noexport(n)
#+EXCLUDE_TAGS: noexport
#+LATEX_HEADER: % \usepackage{pgfpages}
#+LATEX_HEADER: % \setbeameroption{show notes on second screen=right}
#+LATEX_HEADER: \usepackage[american]{babel}
#+LATEX_HEADER: \usepackage[normalem]{ulem}
#+LATEX_HEADER: \usepackage{svg}
#+LATEX_HEADER: \setbeamercovered{invisible}
#+LATEX_HEADER: \AtBeginSection[]{\begin{frame}<beamer>\frametitle{Where are we?}\tableofcontents[currentsection]\end{frame}}
#+LATEX_HEADER: \beamertemplatenavigationsymbolsempty
#+LATEX_HEADER: \usepackage{tikzsymbols}
#+LATEX_HEADER: \def\smiley{\Smiley[1][green!80!white]}
#+LATEX_HEADER: \def\frowny{\Sadey[1][red!80!white]}
#+LATEX_HEADER: \def\winkey{\Winkey[1][yellow]}
#+LATEX_HEADER: \usepackage{color,soul}
#+LATEX_HEADER: \definecolor{lightblue}{rgb}{1,.9,.7}
#+LATEX_HEADER: \sethlcolor{lightblue}
#+LATEX_HEADER: \newcommand{\muuline}[1]{\SoulColor\hl{#1}}
#+LATEX_HEADER: \makeatletter
#+LATEX_HEADER: \newcommand\SoulColor{%
#+LATEX_HEADER: \let\set@color\beamerorig@set@color
#+LATEX_HEADER: \let\reset@color\beamerorig@reset@color}
#+LATEX_HEADER: \makeatother
#+LATEX_HEADER: \let\hrefold=\href
#+LATEX_HEADER: \renewcommand{\href}[2]{\hrefold{#1}{\SoulColor\hl{#2}}}
#+LaTeX: \let\alert=\structure % to make sure the org * * works
#+LaTeX: \begin{frame}{Outline}\tableofcontents\end{frame}
* Test et informations :noexport:
* Internal refs/notes :noexport:
** Images
- Notebook konrad:
- file:../slides-module2/jupyter-grippal-full.png
- file:../slides-module2/jupyter-grippal-top.png
- file:../slides-module2/jupyter-grippal-bottom.png
#+begin_src shell :results output :exports both
cd /home/alegrand/Work/Documents/Enseignements/RR_MOOC/slides-module2
file jupyter-grippal-full.png
rm /tmp/cropped_*
convert -crop 1345x3000 jupyter-grippal-full.png /tmp/cropped_%d.png
convert /tmp/cropped_*.png +append jupyter-grippal-paged.png
#+end_src
#+RESULTS:
: jupyter-grippal-full.png: PNG image data, 1345 x 8772, 8-bit/color RGBA, non-interlaced
#+begin_src shell :results output :exports both
cd /home/alegrand/Work/Documents/Enseignements/RR_MOOC/slides-module2
convert -scale x1507 jupyter-grippal-paged.png ../assets/img/nb3.png
#+end_src
#+RESULTS:
- Notebook Elisabeth: https://bitbucket.org/elizabethpwalton/smpe_project
#+begin_src shell :results output :exports both
cd /home/alegrand/Work/Documents/Enseignements/RR_MOOC/slides-module2
file elizabethpwalton_SMPE.png
rm /tmp/cropped_*
convert -crop 820x2650 elizabethpwalton_SMPE.png /tmp/cropped_%d.png
convert /tmp/cropped_*.png +append elizabethpwalton_SMPE-aged.png
#+end_src
#+RESULTS:
: elizabethpwalton_SMPE.png: PNG image data, 820 x 15217, 8-bit/color RGBA, non-interlaced
#+begin_src shell :results output :exports both
cd /home/alegrand/Work/Documents/Enseignements/RR_MOOC/slides-module2
convert -scale x1507 elizabethpwalton_SMPE-aged.png ../assets/img/nb4.png
#+end_src
#+RESULTS:
- Notebook Ismail:
#+begin_src shell :results output :exports both
cd /home/alegrand/Work/Documents/Enseignements/RR_MOOC/slides-module2
rm /tmp/cropped_*
convert -crop 590x1400 oscar.png /tmp/cropped_%d.png
for i in /tmp/cropped_[1-9].png ; do mv $i `echo $i | sed 's/cropped_/cropped_0/'` ; done
convert /tmp/cropped_*.png +append And_the_Oscar_goes_to-paged.png
#+end_src
#+RESULTS:
#+begin_src shell :results output :exports both
cd /home/alegrand/Work/Documents/Enseignements/RR_MOOC/slides-module2
convert -scale x1507 And_the_Oscar_goes_to-paged.png ../assets/img/nb5.png
#+end_src
#+RESULTS:
- Navette russe: https://io9.gizmodo.com/more-sad-remains-of-the-soviet-buran-space-shuttle-prog-1733190814
- Msieur il marche mon programme: https://www.luc-damas.fr/humeurs/images/il-marche-mon-programme.jpg
- PhD Comics:
- http://phdcomics.com/comics/archive.php?comicid=1947:
http://phdcomics.com/comics/archive/phd050817s.gif
- http://phdcomics.com/comics/archive.php?comicid=1948:
http://phdcomics.com/comics/archive/phd051017s.gif
** Graphe syndrome grippal:
#+begin_src shell :results output raw :exports both
debtree python3-matplotlib > python3-matplotlib.dot
sed -i -e 's/rankdir=LR/rankdir=RL/g' \
-e 's/node \[shape=box\]/node [shape=box, color=black, fillcolor=gray, fontcolor=black, style=filled]/g' \
python3-matplotlib.dot
dot -Tpng python3-matplotlib.dot > python3-matplotlib.png
echo file:python3-matplotlib.png
#+end_src
#+RESULTS:
file:python3-matplotlib.png
#+begin_src shell :results output :exports both
mv python3-matplotlib.png ../assets/img/
#+end_src
#+RESULTS:
* M4-S0: The Rough Road to Real-Life Reproducible Research
** Reproducible Research Hell
file:img/phd_sisyphe.png
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
Bonjour à tous,
Maintenant que vous êtes familiers avec les documents computationnels
et les analyses réplicables, vous disposez des outils principaux vous
permettant d'améliorer votre pratique et de rendre votre recherche
reproductible.
Mais la route est longue et semée d'embûches. Il est temps d'aller un
peu plus loin et que vous preniez consciences des différentes
difficultés auxquelles vous risquez d'être confronté.
Dans ce dernier module, nous vous présenterons trois des enfers de la
recherche reproductible.
** Module 4. The Rough Road to Real-Life Reproducible Research
1. Data Hell
2. Software Hell
3. Numerics Hell
4. Conclusion
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
\scriptsize
*Christophe:* Le premier enfer est celui des données. Quand on travaille
sur de vrais données, leur taille, leur structure, ou leur diversité
peuvent rapidement poser d'importantes difficultés. Je présenterai
quelques approches permettant de survivre dans cet environnement
hostile.
*Arnaud:* Le second enfer est celui du logiciel et on se trouve
rapidement confronté à deux défis. D'une part, le logiciel devient
très rapidement gros, difficile à gérer, et les solutions simples que
nous vous avons présentées passent alors très mal à
l'échelle. D'autre part, aussi étonnant que cela puisse paraître, les
logiciels vieillissent et résistent souvent très mal à l'épreuve du
temps. Je présenterai des exemples concrets et quelques approches
permettant de survivre dans cet environnement hostile.
*Konrad:* Enfin, le troisième enfer est celui du calcul
numérique. J'illustrerai les difficultés que peut poser le calcul avec
des flottants, ou l'ordre des opérations influe sur les
résultats. Comme cet ordre a aussi un impact sur la performance, il
faut trouver un compromis entre temps d'exécution et
reproductibilité. Ceci est particulièrement difficile pour le calcul
parallèle, qui concerne tous les ordinateurs modernes, même les
smartphones. J'évoquerai aussi les précautions à prendre quand on
utilise les nombres aléatoires.
En espérant ne pas vous avoir trop effrayés, nous concluerons enfin
brièvement ce MOOC par quelques remarques de bon sens.
* M4-S1: Data Hell
** The Rough Road to Real-Life Reproducible Research :noexport:
1. *Data Hell*
2. Software Hell
3. Numerics Hell
4. Conclusion
** Two new problems
When we start to work on real data, we typically have to deal with two problems:
- the data are of diverse nature
- the data occupy a lot of memory
** Non-homogeneous data
- The influenza-like illness data from module can easily be presented as a table (2 dimensional object)
- Often the table form must be *abandoned* because
- the columns don't all have the same length
- the data can be a time series *and* a set of images, etc.
** Big data
- *Text formats* are not always appropriate for numbers
- Choice of a *binary format* because
- Numbers occupy less memory
- Numbers in text format must be converted to binary anyway for computation
** Text format features we wish to keep: metadata
- Text permits storing the data *and* all the rest...
- \Rightarrow add information about the data:
- provenance
- recording date
- source
- etc.
- This information about the data is what is called *metadata*
- They are vital for doing reproducible research
** Text format features we wish to keep: endianness
- Text format is universal
- Binary formats depend on hardware architecture and operating system
- The four-bit sequence 1010 can be read as
- 1x1 + 0x2 + 1x4 + 0x8 = 5, which is *little-endianness*
- 1x8 + 0x4 + 1x2 + 0x1 = 10, which is *big-endianness*
- *A binary storage for reproducible research much specify endianness*
** Binary formats for composite data allow storing metadata
Wanted: binary formats for
- working with big datasets of diverse nature
- storing metadata along with the data
- having endianness fixed *once and for all*
** `FITS` and `HDF5`
- The *Flexible Image Transport System* (`FITS`), developed in 1981 and still regularly updated
- The *Hierarchical Data Format* (`HDF`), developed at the *National Center for Supercomputing Applications*, is at its fifth version, `HDF5`
** `FITS`
- `FITS` introduced and updates by the astrophysics community
- Format sufficiently general for use in different contexts
** The anatomy of a `FITS` file
- One or mode segments: *Header/Data Units* (HDUs)
- A HDU is made up of:
- a header (*Header Unit*) followed *optionally* by
- the data (*Data Unit*)
- Header = key-value pair → *metadata*
- Data stored as binary tables (one to 999 dimensions) or as tables (text or binary)
** Manipulation of `FITS` files
- The developers of the format offer a `C` library and associated programs that are easy to use
- `PyFITS` for Python users
- `FITSio` for R users
** `HDF5`
- Hierarchical organization, resembles a filesystem tree
- Structuring element: a *group* (similar to a directory) contains one of more *datasets*
- *Groups* can be nested
- No structure imposed on metadata
- No structure imposed on data - they can be text
** Manipulation of `HDF5` files
- More flexible format \Rightarrow the `C` library is more complex thatn its `FITS` equivalent
- The library is distribued with `HDFView`, a powerful tool for exploring and visualizing data
- `h5py` is a very complete `Python` interface
- Three `R` packages: `h5`, `hdf5r` et `rhdf5`
** Archiving
Git (hub, lab, ...): not well suited for data storage
#+BEGIN_CENTER
#+ATTR_LATEX: :height 1cm :center nil
file:img/Zenodo-logo.jpg
#+ATTR_LATEX: :height 1cm :center nil
file:img/Figshare-logo.png
#+END_CENTER
** Conclusions
- Real data \Rightarrow size and structure problems
- Read data are complex \Rightarrow metadata
- `FITS` and `HDF5` = *practical* solutions
- In terms of complexity and flexibility: `FITS` < `HDF5`
- Archiving platforms \Rightarrow persistent storage accessible for everyone
* M4-S2: Software Hell
** The Rough Road to Real-Life Reproducible Research :noexport:
1. Data Hell
2. *Software Hell*
3. Numerics Hell
4. Conclusion
** Scaling up
#+ATTR_LATEX: :width \linewidth
file:img/il-marche-mon-programme.jpg
** Complex code...
#+LaTeX: \includegraphics<+>[height=6cm]{img/nb1.png}%
#+LaTeX: \includegraphics<+>[height=6cm]{img/nb2.png}%
#+LaTeX: \includegraphics<+>[height=6cm]{img/nb3.png}%
#+LaTeX: \includegraphics<+>[height=6cm]{img/nb4.png}%
#+LaTeX: \includegraphics<+>[height=6cm]{img/grippal_orgmode1.png}%
#+LaTeX: \includegraphics<+>[height=6cm]{img/grippal_orgmode2.png}%
#+LaTeX: \includegraphics<+>[height=6cm]{img/nb5.png}%
- A real spaghetti bowl
- No global view
- Interaction between multiple languages = danger
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
- Des codes compliqués à organiser/orchestrer. Le notebook a ses
limitations et vous pouvez en devenir prisonnier.
** ... that is difficult to orchestrate
#+LaTeX: \only<1>{\begin{overlayarea}{1.5\linewidth}{7cm}
#+ATTR_LATEX: :height 7cm :center nil
file:img/SbmlParameterisation.png
#+ATTR_LATEX: :height 7cm :center nil
file:img/SbmlModelling.png
#+LaTeX: \end{overlayarea}}\pause
*Workflows*:
- Clearer high-level view
- Composition of codes and data movement made explicit
- Safer sharing, reusing, and execution
- Notebooks are a variant that is both impoverished and richer
- No simple/mature path from a notebook to a workflow
*Examples*:
- Galaxy, Kepler, Taverna, Pegasus, Collective Knowledge, VisTrails
- Light-weight: dask, drake, swift, snakemake, ...
- Hybrids: SOS-notebook, ...
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
\scriptsize
- un workflow, c'est quoi ? On restructure le code de façon à rendre
le flot de traitement plus explicite. Chaque bout de code est
encapsulé dans une fonction, on supprime les effets de bord pour que
les entrées et les sorties soient parfaitement identifiées. On
connecte ensuite chacune de ces fonctions les unes avec les
autres.
- Un environnement de workflow fournit les bonnes abstractions, les
bonnes conventions d'écritures permettant d'orchestrer tous ces
appels et c'est ensuite le moteur de workflow qui gère l'exécution
des choses. Non seulement le workflow peut plus facilement exploiter
une machine parallèle, mais en plus, il est possible de sauvegarder
l'état d'avancement du calcul (via les données générées jusqu'ici)
et le reprendre plus tard. Si on décide de modifier une des briques
du workflow, on peut réutiliser les résultats obtenus en amont. Ce
genre de manipulation est bien plus compliquée avec un notebook où
il y a une session, un état global et où le risque d'erreur est bien
plus important.
- Alors, un workflow peut devenir quelque chose de très compliqué et
de pas forcément très clair non plus mais la représentation par un
graphe permet de regrouper et d'agréger certaines parties pour se
concentrer sur l'essentiel tout en pouvant inspecter les détails
quand on le souhaite.
- Un autre avantages du workflow est la capacité à partager des
parties du workflow avec d'autres et à bénéficier des améliorations
que d'autres pourraient apporter à notre propre workflow... C'est un
des intérêt de plates-formes comme taverna ou kepler.
- Le notebook est donc selon moi parfait quand on met quelque chose au
point car il permet de prendre des notes sur ce que l'on fait
et sur pourquoi on le fait. Au fur et à mesure que le notebook
évolue en quelque chose de plus complexe et qu'on a les idées de
plus en plus claires sur les manipulations de données à effectuées,
il devient intéressant de transformer toute cette matière en un
workflow.
- Cette restructuration est manuelle et il n'existe pas encore de
bonne solution pour passer de l'un à l'autre. Il y a des tentatives
intéressantes comme le sos-notebook dans Jupyter mais toutes ces
initiatives sont encore en plein développement.
- L'utilisation d'un workflow ne rend pas l'utilisation d'un notebook
caduque. Le notebook est utile mais à un autre niveau. Les appels au
workflow peuvent parfaitement être faits à partir du notebook et on
utilisxe alors ce dernier pour décrire les expériences que l'on mène
et le résultats des analyses.
** The mess of expensive computations
*Long-running computations* and *big datasets*
- JupyterHub and supercomputers: under development
- Checkpoints and caching
- Workflows permit scaling up
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
\scriptsize
# https://zonca.github.io/2015/04/jupyterhub-hpc.html
# https://github.com/ipython/ipyparallel/issues/167
# https://groups.google.com/forum/#!topic/jupyter/BlexhV8W5TE
Les calculs interminables et les gros volumes de données
- JupyterHub et les supercalculateurs: en développement
- Lancement sur des machines distantes ? Compliqué, pas de bonnes
solutions à l'heure actuelle.
- Actuellement, JupyterHub permet de donner une machine
(éventuellement virtuelle) à chaque notebook
- Il dispose également d'un onglet cluster permettant d'allouer
plusieurs machines à un Ipython parallèle.
- Lorsque l'on souhaite paralléliser c'est la plupart du temps le
langage du notebook qui fait le travail (Ipython parallèle, R au
dessus de spark, etc.), pas le notebook lui même.
- Notebook idéal selon moi: tel bloc peut/doit s'exécuter ailleurs
- Ce qui n'est pas sans poser de nombreux problèmes de sémantiques
(surtout si le mécanisme de session est utilisé et/ou que
plusieurs langages sont utilisés)
- Checkpoint et Cache:
- Il y a des mécanismes de cache dans les trois environnements que
nous vous avons présentés.
- Cela vous permet de ne pas tout réexécuter depuis le début.
- Ne pas confondre l'objet résultant (le graphique ou le tableau) des
données sous-jacentes.
- Un checkpoint explicite (via des fichiers) des données nécessaires
à la suite des calculs est la méthode la plus simple.
- Le workflow gère la séparation des codes et des données, ce qui
permet de passer à l'échelle
# - Histoire de montrer que malgré ça c'est dur:
# https://github.com/IFB-ElixirFr/ReproHackathon/blob/master/docs/index.md
# https://f1000research.com/articles/6-124/v1
** Complex ecosystems
What is hiding behind the simple
#+begin_src python :results output :exports both
import matplotlib
#+end_src
#+LaTeX: \scriptsize
#+BEGIN_EXAMPLE
Package: python3-matplotlib
Version: 2.1.1-2
Depends: python3-dateutil, python-matplotlib-data (>= 2.1.1-2),
python3-pyparsing (>= 1.5.6), python3-six (>= 1.10), python3-tz,
libjs-jquery, libjs-jquery-ui, python3-numpy (>= 1:1.13.1),
python3-numpy-abi9, python3 (<< 3.7), python3 (>= 3.6~),
python3-cycler (>= 0.10.0), python3:any (>= 3.3.2-2~), libc6 (>=
2.14), libfreetype6 (>= 2.2.1), libgcc1 (>= 1:3.0), libpng16-16 (>=
1.6.2-1), libstdc++6 (>= 5.2), zlib1g (>= 1:1.1.4)
#+END_EXAMPLE
#+LaTeX: \only<2>{\vspace{-3.5cm}\includegraphics<2>[width=\linewidth]{img/python3-matplotlib.png}}\vspace{10cm}
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
\scriptsize
- Qu'est-ce qui se cache derrière matplotlib
- Python peut nous dire ce qu'il en sait (i.e., pas grand chose)
mais comment s'assurer que deux personnes exécutent bien ce code
dans le même environnement logiciel
- Dans le cadre de ce MOOC, un serveur jupyter est déployé et un
environnemnt commun est proposé. Mais pouvez vous vous assurer que
vous disposerez du même environnemnt chez vous à la fin du MOOC ?
- Comment réinstaller un tel environnemnent ? Comment packager un
logiciel complexe ?
- Comment faire en sorte qu'il puisse évoluer si un bug est corrigé ?
** Complex ecosystems
\small No standard:
- Linux (=apt=, =rpm=, =yum=), MacOS X (=brew=, =McPorts=, =Fink=), Windows (?)
#+LaTeX: \null\vspace{-.6em}
- Neither for installation nor for retrieving the information... $\frowny$
#+LaTeX: \null\vspace{-.6em}
#+LaTeX: \vspace{-1em}
#+LaTeX: \begin{columns}\begin{column}[t]{.45\linewidth}\scriptsize
#+begin_src python :results output :exports both
import sys
print(sys.version)
import matplotlib
print(matplotlib.__version__)
import pandas as pd
print(pd.__version__)
#+end_src
#+LaTeX: ~\vspace{-2.4em}~\tiny
#+begin_example
3.6.3 (default, Oct 3 2017, 21:16:13)
[GCC 7.2.0]
2.1.1
0.20.3
#+end_example
#+LaTeX: \end{column}\begin{column}[t]{.55\linewidth}\scriptsize
#+begin_src R :results output :session *R* :exports both
library(ggplot2)
sessionInfo()
#+end_src
#+LaTeX: ~\vspace{-2.4em}~\tiny
#+RESULTS:
#+begin_example
R version 3.4.3 (2017-11-30)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Debian GNU/Linux buster/sid
Matrix products: default
BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.7.1
LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.7.1
locale:
[1] LC_CTYPE=fr_FR.UTF-8 LC_NUMERIC=C
[3] LC_TIME=fr_FR.UTF-8 LC_COLLATE=fr_FR.UTF-8
[5] LC_MONETARY=fr_FR.UTF-8 LC_MESSAGES=fr_FR.UTF-8
other attached packages:
[1] ggplot2_2.2.1
loaded via a namespace (and not attached):
[1] colorspace_1.3-2 scales_0.5.0 compiler_3.4.3 lazyeval_0.2.1
[5] plyr_1.8.4 pillar_1.1.0 gtable_0.2.0 tibble_1.4.2
[9] Rcpp_0.12.15 grid_3.4.3 rlang_0.1.6 munsell_0.4.3
#+end_example
#+LaTeX: \end{column}\end{columns}
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
\scriptsize
- Pas de standard:
- Ni pour l'installation ni pour récupérer les informations:
- Linux (Debian =apt=, RedHat =rpm=, ...), MacOS X (=brew=, =McPorts=,
=Fink=), Windows (?)
- Indiquer ses dépendances logicielles, c'est la version 0 de la
reproductibilité. Ça ne coûte pas bien cher et ça permettra à
celui qui viendra après vous de savoir par où commencer.
- Il faut mettre en place une solution ad hoc, selon le langage
utilisé et ce n'est pas simple.
- Lister l'intégralité de ses dépendances logicielles (voire avec
quel compilateur telle bibliothèque a été compilée) peut être très
compliqué
** Controlling one's environment
*A controlled environment:*
- Work in a virtual machine (heavy) or a Docker container (light)
#+LaTeX: \bigskip\begin{columns}\begin{column}[t]{.45\linewidth}
*Preserve the mess*
- Automatic capture of the environment
- [[http://www.pgbovine.net/cde.html][CDE]], [[https://vida-nyu.github.io/reprozip/][ReproZip]], +[[http://reproducible.io/][CARE]]+
#+LaTeX: \end{column}\hspace{-2em}\begin{column}[t]{.52\linewidth}
*Cleaning up*
- Start with a clean environment
- Install only what's strictly necessary (and document it)
- [[https://www.docker.io/][Docker]], [[https://singularity.lbl.gov/][Singularity]], [[https://www.gnu.org/software/guix/][Guix]], [[https://nixos.org/][Nix]], ...
#+LaTeX: \end{column}\end{columns}
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
\scriptsize
- Intro:
- You cannot expect people to find all the chains of dependencies!
- You cannot expect people to install all the dependencies and run your
code smoothly!
- Règle numéro 1 d'un environnement bien contrôlé: travailler dans un
environnement isolé (une machine virtuelle ou bien un conteneur)
- Brève explication de ce que c'est et de la différence. Sans le
savoir, tous ceux qui ont utilisé nos notebooks ont travaillé dans
un conteneur docker.
- Conséquence:
- du point de vue du code exécuté, tout est encapsulé: rien ne
rentre, rien ne sort
- l'utilisation de l'interface graphique peut être un peu compliquée
- exécution a priori possible sur n'importe quel OS (pour une VM,
sur un OS compatible pour un conteneur)
- Un environnement contrôlé: deux approches
- Conserver le bazar ::
- C'est l'approche toute automatique, un outil se charge
d'observer l'exécution de votre logiciel et de capturer
l'ensemble des codes et des bibliothèques utilisées
- Une archive contenant l'environnement peut alors être construite
et partagée. C'est très facile et très pratique.
- Avantage: Facile, permet à quelqu'un d'autre de réexécuter le
code dans les mêmes conditions
- Inconvénient: pas facile de faire évoluer un tel objet, ni de
comprendre comment il fonctionne. Le résultat est une boite
noire.
- Examples: CARE, CDE, Reprozip
- Faire le ménage ::
- On part d'un environnement minimal dans un conteneur
- On rajoute les composants logiciel dont on a besoin au fur et à
mesure
- Idéalement, au fur et à mesure qu'on rajoute ces logiciel, on
scripte leur installation (e.g., dockerfile)
- Avantage: cela permettra de facilement faire évoluer
l'environnement (mise à jour, remplacement d'un composant
défectueux, etc.)
- Inconvénient: demande quelques efforts, en particulier quand les
composants logiciels sont mal packagés (pas partie d'une
distribution, interventions manuelles, etc.) et que beaucoup
d'interactions avec l'extérieur sont nécessaires (le téléchargement
des données doit être bien séparé)
- Examples: Singularity, voire Nix ou GUIX qui permettent une
reconstruction parfaite, un environnement étant encodé de façon
fonctionnel
*** Cruft :noexport:
#+begin_src shell :results output raw :exports both
echo "#+BEGIN_EXAMPLE"
apt-cache show python3-matplotlib # | grep Depends | head -1
echo "#+END_EXAMPLE"
#+end_src
#+RESULTS:
#+BEGIN_EXAMPLE
Package: python3-matplotlib
Source: matplotlib
Version: 2.1.1-2
Installed-Size: 12159
Maintainer: Sandro Tosi <morph@debian.org>
Architecture: amd64
Depends: python3-dateutil, python-matplotlib-data (>= 2.1.1-2), python3-pyparsing (>= 1.5.6), python3-six (>= 1.10), python3-tz, libjs-jquery, libjs-jquery-ui, python3-numpy (>= 1:1.13.1), python3-numpy-abi9, python3 (<< 3.7), python3 (>= 3.6~), python3-cycler (>= 0.10.0), python3:any (>= 3.3.2-2~), libc6 (>= 2.14), libfreetype6 (>= 2.2.1), libgcc1 (>= 1:3.0), libpng16-16 (>= 1.6.2-1), libstdc++6 (>= 5.2), zlib1g (>= 1:1.1.4)
Recommends: python3-pil, python3-tk
Suggests: dvipng, ffmpeg, gir1.2-gtk-3.0, ghostscript, inkscape, ipython3, librsvg2-common, python-matplotlib-doc, python3-cairocffi, python3-gi, python3-gi-cairo, python3-gobject, python3-nose, python3-pyqt4, python3-scipy, python3-sip, python3-tornado, texlive-extra-utils, texlive-latex-extra, ttf-staypuft
Enhances: ipython3
Description-fr: système de traçage basé sur Python dans un style similaire à celui Matlab –⋅Python⋅3
Matplotlib est une bibliothèque de traçage en Python pur conçue pour
apporter à Python des capacités de traçage d'une qualité adaptée à la
publication, avec une syntaxe familière aux utilisateurs de Matlab. L'accès
à toutes les commandes de traçage, dans l'interface pylab, est possible
soit à travers une interface fonctionnelle familière aux utilisateurs de
Matlab, soit à travers une interface orientée objet familière à ceux de Python.
.
Ce paquet fournit la version Python⋅3 de matplotlib.
Description-md5: 29e115db1f22ec2264a195b584329de9
Homepage: http://matplotlib.org/
Section: python
Priority: optional
Filename: pool/main/m/matplotlib/python3-matplotlib_2.1.1-2_amd64.deb
Size: 4597588
MD5sum: bfca8169a6b4e2cd9f89eb2f862083c7
SHA256: cbf80fdbf2643f19f926e33ea24cab3f76286d631d0806a2f665989fb17c76e4
Package: python3-matplotlib
Source: matplotlib
Version: 2.0.0+dfsg1-2
Installed-Size: 7362
Maintainer: Sandro Tosi <morph@debian.org>
Architecture: amd64
Depends: python3-dateutil, python-matplotlib-data (>= 2.0.0+dfsg1-2), python3-pyparsing (>= 1.5.6), python3-six (>= 1.10), python3-tz, libjs-jquery, libjs-jquery-ui, python3-numpy (>= 1:1.10.0~b1), python3-numpy-abi9, python3 (<< 3.6), python3 (>= 3.5~), python3-cycler (>= 0.10.0), python3:any (>= 3.3.2-2~), libc6 (>= 2.14), libfreetype6 (>= 2.2.1), libgcc1 (>= 1:3.0), libpng16-16 (>= 1.6.2-1), libstdc++6 (>= 5.2)
Recommends: python3-pil, python3-tk
Suggests: dvipng, ffmpeg, gir1.2-gtk-3.0, ghostscript, inkscape, ipython3, librsvg2-common, python-matplotlib-doc, python3-cairocffi, python3-gi, python3-gi-cairo, python3-gobject, python3-nose, python3-pyqt4, python3-scipy, python3-sip, python3-tornado, texlive-extra-utils, texlive-latex-extra, ttf-staypuft
Enhances: ipython3
Description-fr: système de traçage basé sur Python dans un style similaire à celui Matlab –⋅Python⋅3
Matplotlib est une bibliothèque de traçage en Python pur conçue pour
apporter à Python des capacités de traçage d'une qualité adaptée à la
publication, avec une syntaxe familière aux utilisateurs de Matlab. L'accès
à toutes les commandes de traçage, dans l'interface pylab, est possible
soit à travers une interface fonctionnelle familière aux utilisateurs de
Matlab, soit à travers une interface orientée objet familière à ceux de Python.
.
Ce paquet fournit la version Python⋅3 de matplotlib.
Description-md5: 29e115db1f22ec2264a195b584329de9
Homepage: http://matplotlib.org/
Section: python
Priority: optional
Filename: pool/main/m/matplotlib/python3-matplotlib_2.0.0+dfsg1-2_amd64.deb
Size: 1589544
MD5sum: e8f0571243df303a9b1f37a8ebf8177d
SHA256: 8f5d3509d4f5451468c6de44fc8dfe391c3df4120079adc01ab5f13ff4194f5a
#+END_EXAMPLE
** The test of time
file:img/soviet_space_shuttle.jpg
** Backwards compatibility
\small
- Python and its rapidly evolving environment
#+LaTeX: \null\vspace{-1em}
#+begin_src shell :results output :exports both
python2 -c "print(10/3)"
python3 -c "print(10/3)"
#+end_src
#+LaTeX: \null\vspace{-2.4em}{\scriptsize
#+RESULTS:
: 3
: 3.3333333333333335
#+LaTeX: }
\pause
#+ATTR_LATEX: :height 3.2cm :center nil
file:img/plot_1.5.3.png
#+ATTR_LATEX: :height 3.2cm :center nil
file:img/plot_2.1.1.png
\pause
- Cortical Thickness Measurements (PLOS ONE,
June 2012): /FreeSurfer/: /differences were found between the Mac and
HP workstations and between Mac OSX 10.5 and OSX 10.6./
- Format incompatibility between orgmode 7.*, 8.*, 9.*, etc.
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
\scriptsize
- Petit exemple en python, le plus simple qui soit, une division:
- Le passage de python2 à python3 a introduit des changements
majeurs puisque la division par défaut qui était à l'origine une
division entière est devenue une division sur des flottants.
- Alors, certains diront que python2 et python3 doivent être
considérés comme deux langages distincts mais même si python2
reste maintenu et continue d'évoluer (doucement), quand tous les
efforts de l'écosystème se tournent vers python3, on est bien
obligé d'emboiter le pas...
- Il y a quelques mois, un de mes collègues qui était bien content
d'avoir utilisé un notebook pour préparer son dernier article et
d'avoir fait bien attention à sauvegarder tout son code et ses
résultats intermédiaires, a été assez surpris en préparant la
révision finale de remarquer que la figure qu'il avait générée 3
mois auparavant avait décidé de changer de couleurs...
- Entre les deux, matplotlib a été mis à jour sur sa machine et il
se trouve qu'entre la version 1.5.12 et la 2.0, la palette de
couleurs par défaut a changé...
- Alors, dans cet exemple précis, ça ne change pas
fondamentalement les choses et le plus important était de
pouvoir mettre à disposition la démarche utilisée mais c'est
quand même assez agaçant.
- Ce type d'incident met en évidence le problème de la perméabilité
à l'environnement extérieur.
** Rapid development tools
*Rapid* but also *fragile* and *unstable*:
- Correction or introduction of bugs
- It becomes necessary to check regularly if environments can still be reconstructed and work (continuous integration, regression testing)
Popper: [[http://falsifiable.us/][http://falsifiable.us/]]
#+ATTR_LATEX: :height 1.5cm :center nil
file:img/popper_logo_just_jug.png
*Another option*:
- Limit onself to what is manageable (C for example)
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
- Les outils informatiques évoluent à une vitesse incroyable et nous
permettent d'aller plus vite, plus loin dans nos recherche. Il est
donc indispensable de s'appuyer dessus.
- Néanmoins, ces développements rapides sont aussi a source de
nombreuses erreurs, de régressions, de corrections (ce qui est une
bonne chose) et très souvent de perte de compatibilité entre les
versions.
- Ce sont des outils à développement rapide dans les deux sens du
terme, c'est à dire des outils qui à la fois vous permettent de
mettre en place des choses complexes très rapidement mais qui
évoluent aussi très (pour ne pas dire trop) rapidement.
- Dans ce contexte mouvant, il devient nécessaire de vérifier
régulièrement que notre code et son environnement peuvent être
regénérés et qu'ils sont fonctionnels. En génie logiciel, les termes
associés sont "intégration continue" (chaque nuit ou bien à chaque
commit dans votre gestionnaire de version, la compilation de votre
code est déclenchée et remonte une alerte en cas de problème) et
"tests de non régression" (une fois votre code et son environnement
compilé, on vérifie via une batterie de tests que les sorties pour
des entrées bien spécifiques sont toujours correctes).
- Certains proposent même une utilisation systématique de ce type
d'approche au processus de recherche. Ça demande un investissement
technique un peu lourd mais dans le principe, pourquoi pas ?
- Il faut garder à l'esprit que les notebooks ou les outils que nous
vous avons présentés font d'ailleurs partie de cette famille
d'outils à développement rapide et n'échappent pas malgré leurs
efforts à ces difficultés de pérennité.
- Pour être le moins possible ennuyé par ce type de problème, certains
font le choix de se restreindre à des outils et des langages très
stables et qu'ils peuvent maîtriser de bout en bout.
- Il faut donc trouver le bon compromis entre modernisme et pérennité.
** Archiving
*Source code management*
- Git (hub, lab, ...) : stable, open, \dots durable ?
- +Google Code+, +Gitorious+, +Code Spaces+
#+ATTR_LATEX: :height 1.3cm :center nil
file:img/swh-logo.png
#+ATTR_LATEX: :height 1.3cm :center nil
file:img/LogoHAL.PNG
*Environment management*
- Longevity of access to Docker Hub, Nix repository, Code Ocean, ... ?
- Once an environment is frozen, what's the lifetime of a virtual machine, a Docker image, ... ?
*Preserve as much information as possible automatically*
- Software, versions, installation procedures
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
- Dans les exercices, faites y bien attention.
# file:img/ArXiv-web.png" height=60 />
# file:img/Zenodo-logo.jpg" height=60 />
# file:img/Figshare-logo.png" height=60 />
* M4-S3: Numerics Hell
** The Rough Road to Real-Life Reproducible Research :noexport:
1. Data Hell
2. Software Hell
3. *Numerics Hell*
4. Conclusion
** Floating-point arithmetic
file:img/polynome1.svg
#+begin_src python :results output :exports both
def polynome(x):
return x**9 - 9.*x**8 + 36.*x**7 - 84.*x**6 + 126.*x**5 \
- 126.*x**4 + 84.*x**3 - 36.*x**2 + 9.*x - 1.
#+end_src
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
Commençons avec un exemple. Mon collègue Arnaud a calculé les valeurs d'un
polynôme d'ordre 9. Le voici.
** Floating-point arithmetic
file:img/polynome2.svg
#+begin_src python :results output :exports both
def horner(x):
return x*(x*(x*(x*(x*(x*(x*(x*(x - 9.) + 36.) - 84.) + 126.) \
- 126.) + 84.) - 36.) + 9.) - 1.
#+end_src
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
Mon collègue Christophe lui fait remarquer que la méthode de Horner résulte dans
un calcul plus efficace. Il s'agit d'un réarrangement des termes qui reduit notamment
le nombre de multiplications. Le voici. Les deux courbes se recouvrent, donc les
résultats sont identiques.
** Floating-point arithmetic
file:img/polynome3.svg
#+begin_src python :results output :exports both
def simple(x):
return (x-1.)**9
# trop facile!
#+end_src
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
Une analyse un peu plus approfondie montre que notre polynôme a une seule racine
à x=1, ce qui nous permet d'en simplifier le calcul. Nous avons maintenant
trois courbes qui se recouvrent. Tout va bien !
** Floating-point arithmetic
file:img/polynome3-4.svg
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
Mais regardons la région autour de x=1 de plus près...
** Floating-point arithmetic
file:img/polynome4.svg
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
Ça a l'air un peu bizarre. Et les trois courbes ne sont enfin pas identiques,
juste proches. Qu'est-ce qui se passe ?
** Rounding
#+LaTeX: \def\round{\texttt{arrondi}}
- Every operation includes implicit rounding.
- a+b is actually \round(a+b).
- Unfortunately:
#+BEGIN_CENTER
\small
\round(\round(a+b)+c) $\ne$ \round(a+\round(b+c)).
#+END_CENTER
- Operation order therefore matters.
*For a reproducible computation, operation order must be preserved!!!*
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
Le résultat d'une opération arithmétique sur des flottant n'est en général pas
représentable par un autre flottant. On applique une opération d'arrondi qui
remplace le résultat exact avec une valeur proche qui est représentable.
A cause de l'arrondi, les règles habituelles de l'arithmétique ne sont plus
applicables à l'identique. On perd notamment l'associativité de l'addition et
de la multiplication.
En changeant l'ordre des opérations, on peut donc changer le résultat !
** How to explain it to my compiler?
To speed up computations, compilers may change operation order, and thus results.
Two options for computing reproducibly:
- Insist on the preservation of operation order,
- if the language permits it.
- Example: Module `ieee_arithmetic` in Fortran 2003
- Make compilation reproducible:
- Record the precise compiler version
- Record all compilation options
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
Ceci devient un obstacle à la reproductibilité à cause des
optimisations appliquées par les compilateurs pour accélérer le
calcul. Celle-ci changent souvent l'ordre des opérations et donc le
résultat.
Pour rendre un calcul reproductible, il y a deux
approches. Premièrement, on peut dire à son compilateur de ne pas
toucher à l'ordre des opérations, idéalement dans le code source du
logiciel. Ceci est possible par exemple dans le langage Fortran
2003.
L'autre approche est de rendre la compilation elle-même
reproductible en notant la version précise du compilateur utilisé,
ainsi que toutes les options de compilation. Idéalement, il faut
alors archiver le compilateur avec le logiciel de calcul.
** Parallel computation
- Goal: get results sooner
\to Minimize communications between processosrs
\to Adapt data distribution
\to \dots hence the operation order $\frowny$
- Consequence: results depends on the number of processors!
*Minimizing the impact of parallelism is an active research topic.*
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
Un autre obstacle à la reproductibilité résulte du calcul parallèle.
Celui-ci a comme seul objectif une exécution plus rapide. Pour y arriver,
il faut minimiser la communication entre les processeurs en adaptant
la répartition des données. Ceci implique d'adapter l'ordre des opérations,
car chaque processeur traite d'abord ses données locales avant d'entrer en
communication avec les autres processeurs.
La conséquence est que le résultat du calcul change avec le nombre
de processeurs utilisés.
On peut tenter d'écrire le logiciel tel que l'impact de cette variation
soit minimisé. Mais il n'y a pour l'instant aucune technique éprouvée
pour y arriver. Ceci reste un sujet de recherche.
** Parallel computation: example
file:img/gouttedo1.png
Source: Rafife Nheili, PhD. Thesis, University of Perpignan, 2016
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
Regardons un simple exemple: la simulation des vagues causées dans
un bassin carré d'eau par une goutte qui tombe au milieu. A gauche,
la simulation exécutée sur un seul processeur. A droite, le résultat
d'un calcul sur quatre proecesseurs, ou les points qui diffèrent
sont colorés en gris.
** Parallel computation: example
file:img/gouttedo2.png
Source: Rafife Nheili, PhD. Thesis, University of Perpignan, 2016
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
Un pas de temps plus loin, le nombre de points à résultat différent
a nettement augmenté. Il continuera a augmenter au cours de la
simulation, jusqu'à ce qu'il n'y a plus aucun point pour lequel le
résultat restera identique.
** Computing platforms
- Computing platform: hardware + infrastructure software
- Computation = platform + software + data
- The platform defines the interpretation of the software.
- Platform and software define the interpretation of the data.
- Other platform-defined aspects:
- integer representation (16/32/64 bits)
- error handling
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
Les obstacles à la reproductibilité dûs à l'arithmétique à virgule flottante
sont un cas spécial important de la dépendance des plateformes. Un logiciel
est écrit dans un langage de programmation, mais l'interprétation précise de
ce langage est définie par la plateforme de calcul utilisé. Celle-ci consiste
du matériel, notamment du processeur, et de l'infrastructure logiciel:
système d'exploitation, compilateurs, etc.
Un calcul est défini par trois ingrédients: la plateforme, le logiciel, et les
données traitées. La plateforme définit comment est interprété le logiciel,
et les deux ensembles définissent comment sont interprétées les donées.
L'arithmétique à virgule flottante est interprétée différemment par les différentes
plateformes de calcul populaires aujourd'hui, mais ce n'est pas le seul point
de divergence. Dans certains langage comme le C ou le Fortran, les entiers sont
aussi concernés car les plateformes leur attribuent des tailles et donc des
intervalles de valeurs différentes. Enfin, les erreurs de calcul, comme par
exemple la division par zéro, ne sont pas gérées de la ême façon par toutes les
plateformes.
** Random numbers
- Used to simulate stochastic processes.
- In practice: *pseudo-* random numbers.
- Series of numbers that *appear* to be random...
- ... but are generated by a deterministic algorithm.
** Pseudo-random number generators
#+LaTeX: \vspace{1cm}
#+LaTeX: \only<+>{\includesvg[scale=.45]{img/nombres-aleatoires-1.svg}}
#+LaTeX: \only<+>{\includesvg[scale=.45]{img/nombres-aleatoires-2.svg}}
#+LaTeX: \only<+>{\includesvg[scale=.45]{img/nombres-aleatoires-3.svg}}
#+LaTeX: \only<+>{\includesvg[scale=.45]{img/nombres-aleatoires-4.svg}}
#+LaTeX: \vspace{10cm}
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
On part d'un état initial appelé "graine" (typiquement un entier).
Pour générer un nombre, on applique une transformation à cet état,
puis on calcule le nombre comme fonction de cet état.
On repète autant que nécessaire.
** Reproducibility in theory
- Principle: same seed + same algorithm → same series
- The seed is often chosen as a function of time
- It must be defined in the application code
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
En principe, il suffit d'utiliser la même graine et le même algorithme pour
toujours avoir la même suite de nombres.
L'algorithme fait partie d'une librairie, dont il faut noter la version
utilisée. Les librairie de nombres aléatoires choisissent souvent la graine
comme fonction de l'heure, pour donner une apparence "plus aléatoire".
Mais pour la reproductibilité, il faut définir la graine dans le code
d'application.
** Reproductibility in practice
- Same seed + same algorithm → same series: \newline
not obvious with floating-point arithmetic!
- A simple trick to permit verification: \newline
test the first values of the series.
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
En pratique, il n'est pas si facile d'obtenir une suite identique, même avec
la même version de la même librairie, à cause de la variation dans l'arithmétique
à virgule flottante.
Un astuce simple est de tester quelques valeurs du début de la suite. Si elle ne
sont pas identiques, on sait que la suite a changé.
** Example: the Python language
#+begin_src python :results output :exports both
import random
random.seed(123)
for i in range(5):
print(random.random())
#+end_src
#+LaTeX: \scriptsize
#+RESULTS:
: 0.0523635988509
: 0.0871866775226
: 0.40724176367
: 0.107700234938
: 0.901198877952
#+LaTeX: \vfill
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
Voici l'application de cet astuce en langage Python. On commence par
définir la graine et d'afficher les premières valeurs de la suit de
nombres pseudo-aléatoires.
** Example: the Python language
#+begin_src python :results output :exports both
import random
random.seed(123)
assert random.random() == 0.052363598850944326
assert random.random() == 0.08718667752263232
assert random.random() == 0.4072417636703983
#+end_src
#+RESULTS:
#+LaTeX: \vfill
*** Notes
:PROPERTIES:
:BEAMER_ENV: note
:END:
Puis on modifie le code en remplaçant l'affichage des valeurs par des
comparaisons aux valeurs précédemment affichées. En cas de divergence,
le programme s'arrête avec un message d'erreur.
** Take-home message
- The results of a numerical computation depend on
- the software
- the input data
- the computing platform: hardware, compilers, ...
- Platform influence is important for floating-point arithmetic.
Record all parameters on which your results may depend:
- compiler version, compilation options
- hardware (processor type, GPU, ...)
- number of processors
- When using a random number generator, define your own seed and
verify the first elements of the series.
* M4-S4: Conclusion
** The Rough Road to Real-Life Reproducible Research :noexport:
1. Data Hell
2. Software Hell
3. Numerics Hell
4. *Conclusion*
** The take-home message of the MOOC
*A major concern*
- Scientific method
- Inspectability and reusability
*Tools exist*
- Computational documents and workflows, version control and archives,
software environments, continuous integration, ...
- These tools evolve constantly
- Choose those that are best adapted to your context
- Find a compromise between modern and durable tools
*Use in practice, don't get discouraged!*
- Takes notes rigorously
- Make information useable and accessible
- Improve in small steps
* Emacs Setup :noexport:
This document has local variables in its postembule, which should
allow Org-mode (9) to work seamlessly without any setup. If you're
uncomfortable using such variables, you can safely ignore them at
startup. Exporting may require that you copy them in your .emacs.
# Local Variables:
# eval: (add-to-list 'org-latex-packages-alist '("" "minted"))
# eval: (setq org-latex-listings 'minted)
# eval: (setq org-latex-minted-options '(("style" "Tango") ("bgcolor" "Moccasin") ("frame" "lines") ("linenos" "true") ("fontsize" "\\scriptsize")))
# eval: (setq org-latex-pdf-process '("pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f"))
# End:
Hello world ! It works
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment