[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
02/45: Add the beginnings of a RepPar 2015 paper.
From: |
Ludovic Courtès |
Subject: |
02/45: Add the beginnings of a RepPar 2015 paper. |
Date: |
Tue, 09 Jun 2015 12:36:58 +0000 |
civodul pushed a commit to branch master
in repository maintenance.
commit 84491fbd88ebbb2508f62f03426abd487bf22235
Author: Ludovic Courtès <address@hidden>
Date: Thu May 28 23:36:45 2015 +0200
Add the beginnings of a RepPar 2015 paper.
---
.gitignore | 5 +
doc/reppar-2015/code/manifest.scm | 9 +
doc/reppar-2015/code/my-openmpi.scm | 37 +
doc/reppar-2015/code/query-package.scm | 13 +
doc/reppar-2015/llncs.cls | 1208 ++++++++++++++++++++++++++++++++
doc/reppar-2015/outline.org | 168 +++++
doc/reppar-2015/reproducible-hpc.skb | 441 ++++++++++++
7 files changed, 1881 insertions(+), 0 deletions(-)
diff --git a/.gitignore b/.gitignore
index 8eb754f..56e2a7b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,3 +15,8 @@
/talks/fosdem-2015/guix-fosdem-2015.snm
/talks/fosdem-2015/guix-fosdem-2015.toc
/talks/fosdem-2015/guix-fosdem-2015.vrb
+/doc/reppar-2015/reproducible-hpc.aux
+/doc/reppar-2015/reproducible-hpc.log
+/doc/reppar-2015/reproducible-hpc.out
+/doc/reppar-2015/reproducible-hpc.pdf
+/doc/reppar-2015/reproducible-hpc.tex
diff --git a/doc/reppar-2015/code/manifest.scm
b/doc/reppar-2015/code/manifest.scm
new file mode 100644
index 0000000..2f768a9
--- /dev/null
+++ b/doc/reppar-2015/code/manifest.scm
@@ -0,0 +1,9 @@
+;; This file can be passed to 'guix package --manifest' to
+;; reproduce a profile with the given list of packages.
+
+(use-modules (gnu packages base)
+ (gnu packages gcc)
+ (my-openmpi))
+
+(packages->manifest
+ (list glibc-utf8-locales gnu-make gcc-toolchain openmpi))
diff --git a/doc/reppar-2015/code/my-openmpi.scm
b/doc/reppar-2015/code/my-openmpi.scm
new file mode 100644
index 0000000..c1cb4c7
--- /dev/null
+++ b/doc/reppar-2015/code/my-openmpi.scm
@@ -0,0 +1,37 @@
+(define-module (my-openmpi)
+ #:use-module (guix)
+ #:use-module (guix build-system gnu)
+ #:use-module (guix licenses)
+ #:use-module (guix utils)
+ #:use-module (gnu packages pkg-config)
+ #:use-module ((gnu packages gcc) #:select (gfortran-4.8))
+ #:use-module ((gnu packages mpi) #:select (hwloc))
+ #:export (openmpi))
+
+(define openmpi
+ (package
+ (name "openmpi")
+ (version "1.8.1")
+ (source (origin
+ (method url-fetch)
+ (uri (string-append
+ "http://www.open-mpi.org/software/ompi/v"
+ (version-major+minor version)
+ "/downloads/openmpi-" version ".tar.bz2"))
+ (sha256
+ (base32
+ "13z1q69f3qwmmhpglarfjminfy2yw4rfqr9jydjk5507q3mjf50p"))))
+ (build-system gnu-build-system) ;!recipe-build-system
+ (inputs `(("hwloc" ,hwloc) ;!recipe-inputs
+ ("gfortran" ,gfortran-4.8)
+ ("pkg-config" ,pkg-config)))
+ (arguments
+ '(#:configure-flags `("--enable-oshmem"
+ "--with-devel-headers"
+ ,(string-append
+ "--with-hwloc="
+ (assoc-ref %build-inputs "hwloc")))))
+ (home-page "http://www.open-mpi.org")
+ (synopsis "MPI-2 implementation")
+ (description "This is an MPI-2 implementation etc.")
+ (license bsd-2)))
diff --git a/doc/reppar-2015/code/query-package.scm
b/doc/reppar-2015/code/query-package.scm
new file mode 100644
index 0000000..66c03a6
--- /dev/null
+++ b/doc/reppar-2015/code/query-package.scm
@@ -0,0 +1,13 @@
+(define-module (query-package)
+ #:use-module (my-openmpi)
+ #:use-module (guix)
+ #:use-module (ice-9 match))
+
+;;!start
+;; Query the direct and indirect inputs of Open MPI.
+;; Each input is represented by a label/package tuple;
+;; we are only interested in the package object here.
+(map (match-lambda
+ ((label package)
+ (package-full-name package)))
+ (package-transitive-inputs openmpi))
diff --git a/doc/reppar-2015/llncs.cls b/doc/reppar-2015/llncs.cls
new file mode 100644
index 0000000..40eae17
--- /dev/null
+++ b/doc/reppar-2015/llncs.cls
@@ -0,0 +1,1208 @@
+% LLNCS DOCUMENT CLASS -- version 2.19 (31-Mar-2014)
+% Springer Verlag LaTeX2e support for Lecture Notes in Computer Science
+%
+%%
+%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+%%
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+\ProvidesClass{llncs}[2014/03/31 v2.19
+^^J LaTeX document class for Lecture Notes in Computer Science]
+% Options
address@hidden
address@hidden
+\DeclareOption{citeauthoryear}{\let\citeauthoryear=Y}
+\DeclareOption{oribibl}{\let\oribibl=Y}
address@hidden
address@hidden
address@hidden
address@hidden
address@hidden
address@hidden
address@hidden
address@hidden
+
address@hidden
address@hidden
address@hidden
+
+% languages
+\let\switcht@@therlang\relax
address@hidden@@address@hidden
address@hidden@@address@hidden
+
+\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
+
+\ProcessOptions
+
+\LoadClass[twoside]{article}
+\RequirePackage{multicol} % needed for the list of participants, index
+\RequirePackage{aliascnt}
+
+\setlength{\textwidth}{12.2cm}
+\setlength{\textheight}{19.3cm}
address@hidden
address@hidden
+%
address@hidden
+ \ifnum #1>address@hidden \else
+ \vskip \z@ address@hidden@
+ {\leftskip #2\relax \rightskip address@hidden \advance\rightskip by 0pt
plus 2cm
+ \parfillskip -\rightskip \pretolerance=10000
+ \parindent address@hidden
+ address@hidden
+ \leavevmode
+ address@hidden #3\relax
+ \advance\leftskip address@hidden \null\nobreak\hskip -\leftskip
+ {#4}\nobreak
+ address@hidden
+ \mkern address@hidden mu\hbox{.}\mkern address@hidden
+ mu$}\hfill
+ \nobreak
+ address@hidden@address@hidden \normalcolor #5}%
+ \par}%
+ \fi}
+%
address@hidden
+\def\abstractname{Abstract.}%
+\def\ackname{Acknowledgement.}%
+\def\andname{and}%
+\def\lastandname{\unskip, and}%
+\def\appendixname{Appendix}%
+\def\chaptername{Chapter}%
+\def\claimname{Claim}%
+\def\conjecturename{Conjecture}%
+\def\contentsname{Table of Contents}%
+\def\corollaryname{Corollary}%
+\def\definitionname{Definition}%
+\def\examplename{Example}%
+\def\exercisename{Exercise}%
+\def\figurename{Fig.}%
+\def\keywordname{{\bf Keywords:}}%
+\def\indexname{Index}%
+\def\lemmaname{Lemma}%
+\def\contriblistname{List of Contributors}%
+\def\listfigurename{List of Figures}%
+\def\listtablename{List of Tables}%
+\def\mailname{{\it Correspondence to\/}:}%
+\def\noteaddname{Note added in proof}%
+\def\notename{Note}%
+\def\partname{Part}%
+\def\problemname{Problem}%
+\def\proofname{Proof}%
+\def\propertyname{Property}%
+\def\propositionname{Proposition}%
+\def\questionname{Question}%
+\def\remarkname{Remark}%
+\def\seename{see}%
+\def\solutionname{Solution}%
+\def\subclassname{{\it Subject Classifications\/}:}%
+\def\tablename{Table}%
+\def\theoremname{Theorem}}
address@hidden
+% Names of theorem like environments are already defined
+% but must be translated if another language is chosen
+%
+% French section
address@hidden parle francais.}%
+ \def\abstractname{R\'esum\'e.}%
+ \def\ackname{Remerciements.}%
+ \def\andname{et}%
+ \def\lastandname{ et}%
+ \def\appendixname{Appendice}%
+ \def\chaptername{Chapitre}%
+ \def\claimname{Pr\'etention}%
+ \def\conjecturename{Hypoth\`ese}%
+ \def\contentsname{Table des mati\`eres}%
+ \def\corollaryname{Corollaire}%
+ \def\definitionname{D\'efinition}%
+ \def\examplename{Exemple}%
+ \def\exercisename{Exercice}%
+ \def\figurename{Fig.}%
+ \def\keywordname{{\bf Mots-cl\'e:}}%
+ \def\indexname{Index}%
+ \def\lemmaname{Lemme}%
+ \def\contriblistname{Liste des contributeurs}%
+ \def\listfigurename{Liste des figures}%
+ \def\listtablename{Liste des tables}%
+ \def\mailname{{\it Correspondence to\/}:}%
+ \def\noteaddname{Note ajout\'ee \`a l'\'epreuve}%
+ \def\notename{Remarque}%
+ \def\partname{Partie}%
+ \def\problemname{Probl\`eme}%
+ \def\proofname{Preuve}%
+ \def\propertyname{Caract\'eristique}%
+%\def\propositionname{Proposition}%
+ \def\questionname{Question}%
+ \def\remarkname{Remarque}%
+ \def\seename{voir}%
+ \def\solutionname{Solution}%
+ \def\subclassname{{\it Subject Classifications\/}:}%
+ \def\tablename{Tableau}%
+ \def\theoremname{Th\'eor\`eme}%
+}
+%
+% German section
address@hidden spricht deutsch.}%
+ \def\abstractname{Zusammenfassung.}%
+ \def\ackname{Danksagung.}%
+ \def\andname{und}%
+ \def\lastandname{ und}%
+ \def\appendixname{Anhang}%
+ \def\chaptername{Kapitel}%
+ \def\claimname{Behauptung}%
+ \def\conjecturename{Hypothese}%
+ \def\contentsname{Inhaltsverzeichnis}%
+ \def\corollaryname{Korollar}%
+%\def\definitionname{Definition}%
+ \def\examplename{Beispiel}%
+ \def\exercisename{\"Ubung}%
+ \def\figurename{Abb.}%
+ \def\keywordname{{\bf Schl\"usselw\"orter:}}%
+ \def\indexname{Index}%
+%\def\lemmaname{Lemma}%
+ \def\contriblistname{Mitarbeiter}%
+ \def\listfigurename{Abbildungsverzeichnis}%
+ \def\listtablename{Tabellenverzeichnis}%
+ \def\mailname{{\it Correspondence to\/}:}%
+ \def\noteaddname{Nachtrag}%
+ \def\notename{Anmerkung}%
+ \def\partname{Teil}%
+%\def\problemname{Problem}%
+ \def\proofname{Beweis}%
+ \def\propertyname{Eigenschaft}%
+%\def\propositionname{Proposition}%
+ \def\questionname{Frage}%
+ \def\remarkname{Anmerkung}%
+ \def\seename{siehe}%
+ \def\solutionname{L\"osung}%
+ \def\subclassname{{\it Subject Classifications\/}:}%
+ \def\tablename{Tabelle}%
+%\def\theoremname{Theorem}%
+}
+
+% Ragged bottom for the actual page
address@hidden@ plus.0001fil
address@hidden
+
+\renewcommand\small{%
+ address@hidden@ixpt{11}%
+ \abovedisplayskip 8.5\p@ address@hidden@ address@hidden@
+ \abovedisplayshortskip \z@ address@hidden@
+ \belowdisplayshortskip 4\p@ address@hidden@ address@hidden@
+ address@hidden
+ \parsep 0\p@ address@hidden@ address@hidden@
+ \topsep 8\p@ address@hidden@ address@hidden@
+ address@hidden
+ \belowdisplayskip \abovedisplayskip
+}
+
+\frenchspacing
+\widowpenalty=10000
+\clubpenalty=10000
+
+\setlength\oddsidemargin address@hidden
+\setlength\evensidemargin address@hidden
+\setlength\marginparwidth address@hidden
+
+\setlength\headsep address@hidden
+
address@hidden
address@hidden 2\p@ address@hidden address@hidden
+\setlength\intextsep address@hidden 2\p@ address@hidden address@hidden
+
+\setcounter{secnumdepth}{2}
+
+\newcounter {chapter}
+\renewcommand\thechapter address@hidden@chapter}
+
address@hidden address@hidden
+\newcommand\frontmatter{\cleardoublepage
+ address@hidden
+\newcommand\mainmatter{\cleardoublepage
+ address@hidden
address@hidden
+ address@hidden
+
+\renewcommand\part{\cleardoublepage
+ \thispagestyle{empty}%
+ address@hidden
+ \onecolumn
+ address@hidden
+ \else
+ address@hidden
+ \fi
+ \null\vfil
+ address@hidden@spart}
+
address@hidden
+ \ifnum address@hidden >-2\relax
+ \refstepcounter{part}%
+ \addcontentsline{toc}{part}{\thepart\hspace{1em}#1}%
+ \else
+ \addcontentsline{toc}{part}{#1}%
+ \fi
+ \markboth{}{}%
+ {\centering
+ \interlinepenalty address@hidden
+ \normalfont
+ \ifnum address@hidden >-2\relax
+ \huge\bfseries \partname~\thepart
+ \par
+ \vskip 20\p@
+ \fi
+ \Huge \bfseries #2\par}%
+ address@hidden
address@hidden
+ {\centering
+ \interlinepenalty address@hidden
+ \normalfont
+ \Huge \bfseries #1\par}%
+ address@hidden
address@hidden
+ address@hidden
+ \null
+ \thispagestyle{empty}%
+ \newpage
+ \fi
+ address@hidden
+ \twocolumn
+ \fi}
+
+\newcommand\chapter{\clearpage
+ \thispagestyle{empty}%
+ address@hidden@
+ address@hidden
+ address@hidden@schapter}
address@hidden address@hidden >address@hidden
+ address@hidden
+ \refstepcounter{chapter}%
+ address@hidden
+ \addcontentsline{toc}{chapter}%
+ {\protect\numberline{\thechapter}#1}%
+ \else
+ \addcontentsline{toc}{chapter}{#1}%
+ \fi
+ \else
+ \addcontentsline{toc}{chapter}{#1}%
+ \fi
+ \chaptermark{#1}%
+ address@hidden
+ address@hidden
+ address@hidden
+ address@hidden@makechapterhead{#2}]%
+ \else
+ address@hidden
+ address@hidden
+ \fi}
address@hidden
+% address@hidden
+ {\centering
+ \ifnum address@hidden >address@hidden
+ address@hidden
+ \large\bfseries address@hidden \thechapter
+ \par\nobreak
+ \vskip 20\p@
+ \fi
+ \fi
+ address@hidden
+ \Large \bfseries #1\par\nobreak
+ \vskip 40\p@
+ }}
address@hidden@twocolumn
+ address@hidden@makeschapterhead{#1}]%
+ \else
+ address@hidden
+ address@hidden
+ \fi}
address@hidden
+% address@hidden
+ {\centering
+ \normalfont
+ address@hidden
+ \Large \bfseries #1\par\nobreak
+ \vskip 40\p@
+ }}
+
address@hidden@}%
+ {-18\p@ address@hidden -4\p@ address@hidden
address@hidden
+ {12\p@ address@hidden 4\p@ address@hidden address@hidden
+ {\normalfont\large\bfseries\boldmath
+ \rightskip=\z@ address@hidden 8em\pretolerance=10000 }}
address@hidden@}%
+ {-18\p@ address@hidden -4\p@ address@hidden
address@hidden
+ {8\p@ address@hidden 4\p@ address@hidden address@hidden
+ {\normalfont\normalsize\bfseries\boldmath
+ \rightskip=\z@ address@hidden 8em\pretolerance=10000 }}
address@hidden@}%
+ {-18\p@ address@hidden -4\p@ address@hidden
address@hidden
+ {-0.5em address@hidden -0.22em address@hidden -0.1em}%
+ {\normalfont\normalsize\bfseries\boldmath}}
address@hidden@}%
+ {-12\p@ address@hidden -4\p@ address@hidden
address@hidden
+ {-0.5em address@hidden -0.22em address@hidden -0.1em}%
+ {\normalfont\normalsize\itshape}}
+\renewcommand\subparagraph[1]{\typeout{LLNCS warning: You should not use
+ \string\subparagraph\space with this class}\vskip0.5cm
+You should not use \verb|\subparagraph| with this class.\vskip0.5cm}
+
+\DeclareMathSymbol{\Gamma}{\mathalpha}{letters}{"00}
+\DeclareMathSymbol{\Delta}{\mathalpha}{letters}{"01}
+\DeclareMathSymbol{\Theta}{\mathalpha}{letters}{"02}
+\DeclareMathSymbol{\Lambda}{\mathalpha}{letters}{"03}
+\DeclareMathSymbol{\Xi}{\mathalpha}{letters}{"04}
+\DeclareMathSymbol{\Pi}{\mathalpha}{letters}{"05}
+\DeclareMathSymbol{\Sigma}{\mathalpha}{letters}{"06}
+\DeclareMathSymbol{\Upsilon}{\mathalpha}{letters}{"07}
+\DeclareMathSymbol{\Phi}{\mathalpha}{letters}{"08}
+\DeclareMathSymbol{\Psi}{\mathalpha}{letters}{"09}
+\DeclareMathSymbol{\Omega}{\mathalpha}{letters}{"0A}
+
+\let\footnotesize\small
+
address@hidden
+\def\vec#1{\mathchoice{\mbox{\boldmath$\displaystyle#1$}}
+{\mbox{\boldmath$\textstyle#1$}}
+{\mbox{\boldmath$\scriptstyle#1$}}
+{\mbox{\boldmath$\scriptscriptstyle#1$}}}
+\fi
+
+\def\squareforqed{\hbox{\rlap{$\sqcap$}$\sqcup$}}
+\def\qed{\ifmmode\squareforqed\else{\unskip\nobreak\hfil
+\penalty50\hskip1em\null\nobreak\hfil\squareforqed
+\parfillskip=0pt\finalhyphendemerits=0\endgraf}\fi}
+
+\def\getsto{\mathrel{\mathchoice {\vcenter{\offinterlineskip
+\halign{\hfil
+$\displaystyle##$\hfil\cr\gets\cr\to\cr}}}
+{\vcenter{\offinterlineskip\halign{\hfil$\textstyle##$\hfil\cr\gets
+\cr\to\cr}}}
+{\vcenter{\offinterlineskip\halign{\hfil$\scriptstyle##$\hfil\cr\gets
+\cr\to\cr}}}
+{\vcenter{\offinterlineskip\halign{\hfil$\scriptscriptstyle##$\hfil\cr
+\gets\cr\to\cr}}}}}
+\def\lid{\mathrel{\mathchoice {\vcenter{\offinterlineskip\halign{\hfil
+$\displaystyle##$\hfil\cr<\cr\noalign{\vskip1.2pt}=\cr}}}
+{\vcenter{\offinterlineskip\halign{\hfil$\textstyle##$\hfil\cr<\cr
+\noalign{\vskip1.2pt}=\cr}}}
+{\vcenter{\offinterlineskip\halign{\hfil$\scriptstyle##$\hfil\cr<\cr
+\noalign{\vskip1pt}=\cr}}}
+{\vcenter{\offinterlineskip\halign{\hfil$\scriptscriptstyle##$\hfil\cr
+<\cr
+\noalign{\vskip0.9pt}=\cr}}}}}
+\def\gid{\mathrel{\mathchoice {\vcenter{\offinterlineskip\halign{\hfil
+$\displaystyle##$\hfil\cr>\cr\noalign{\vskip1.2pt}=\cr}}}
+{\vcenter{\offinterlineskip\halign{\hfil$\textstyle##$\hfil\cr>\cr
+\noalign{\vskip1.2pt}=\cr}}}
+{\vcenter{\offinterlineskip\halign{\hfil$\scriptstyle##$\hfil\cr>\cr
+\noalign{\vskip1pt}=\cr}}}
+{\vcenter{\offinterlineskip\halign{\hfil$\scriptscriptstyle##$\hfil\cr
+>\cr
+\noalign{\vskip0.9pt}=\cr}}}}}
+\def\grole{\mathrel{\mathchoice {\vcenter{\offinterlineskip
+\halign{\hfil
+$\displaystyle##$\hfil\cr>\cr\noalign{\vskip-1pt}<\cr}}}
+{\vcenter{\offinterlineskip\halign{\hfil$\textstyle##$\hfil\cr
+>\cr\noalign{\vskip-1pt}<\cr}}}
+{\vcenter{\offinterlineskip\halign{\hfil$\scriptstyle##$\hfil\cr
+>\cr\noalign{\vskip-0.8pt}<\cr}}}
+{\vcenter{\offinterlineskip\halign{\hfil$\scriptscriptstyle##$\hfil\cr
+>\cr\noalign{\vskip-0.3pt}<\cr}}}}}
+\def\bbbr{{\rm I\!R}} %reelle Zahlen
+\def\bbbm{{\rm I\!M}}
+\def\bbbn{{\rm I\!N}} %natuerliche Zahlen
+\def\bbbf{{\rm I\!F}}
+\def\bbbh{{\rm I\!H}}
+\def\bbbk{{\rm I\!K}}
+\def\bbbp{{\rm I\!P}}
+\def\bbbone{{\mathchoice {\rm 1\mskip-4mu l} {\rm 1\mskip-4mu l}
+{\rm 1\mskip-4.5mu l} {\rm 1\mskip-5mu l}}}
+\def\bbbc{{\mathchoice {\setbox0=\hbox{$\displaystyle\rm C$}\hbox{\hbox
+to0pt{\kern0.4\wd0\vrule height0.9\ht0\hss}\box0}}
+{\setbox0=\hbox{$\textstyle\rm C$}\hbox{\hbox
+to0pt{\kern0.4\wd0\vrule height0.9\ht0\hss}\box0}}
+{\setbox0=\hbox{$\scriptstyle\rm C$}\hbox{\hbox
+to0pt{\kern0.4\wd0\vrule height0.9\ht0\hss}\box0}}
+{\setbox0=\hbox{$\scriptscriptstyle\rm C$}\hbox{\hbox
+to0pt{\kern0.4\wd0\vrule height0.9\ht0\hss}\box0}}}}
+\def\bbbq{{\mathchoice {\setbox0=\hbox{$\displaystyle\rm
+Q$}\hbox{\raise
+0.15\ht0\hbox to0pt{\kern0.4\wd0\vrule height0.8\ht0\hss}\box0}}
+{\setbox0=\hbox{$\textstyle\rm Q$}\hbox{\raise
+0.15\ht0\hbox to0pt{\kern0.4\wd0\vrule height0.8\ht0\hss}\box0}}
+{\setbox0=\hbox{$\scriptstyle\rm Q$}\hbox{\raise
+0.15\ht0\hbox to0pt{\kern0.4\wd0\vrule height0.7\ht0\hss}\box0}}
+{\setbox0=\hbox{$\scriptscriptstyle\rm Q$}\hbox{\raise
+0.15\ht0\hbox to0pt{\kern0.4\wd0\vrule height0.7\ht0\hss}\box0}}}}
+\def\bbbt{{\mathchoice {\setbox0=\hbox{$\displaystyle\rm
+T$}\hbox{\hbox to0pt{\kern0.3\wd0\vrule height0.9\ht0\hss}\box0}}
+{\setbox0=\hbox{$\textstyle\rm T$}\hbox{\hbox
+to0pt{\kern0.3\wd0\vrule height0.9\ht0\hss}\box0}}
+{\setbox0=\hbox{$\scriptstyle\rm T$}\hbox{\hbox
+to0pt{\kern0.3\wd0\vrule height0.9\ht0\hss}\box0}}
+{\setbox0=\hbox{$\scriptscriptstyle\rm T$}\hbox{\hbox
+to0pt{\kern0.3\wd0\vrule height0.9\ht0\hss}\box0}}}}
+\def\bbbs{{\mathchoice
+{\setbox0=\hbox{$\displaystyle \rm S$}\hbox{\raise0.5\ht0\hbox
+to0pt{\kern0.35\wd0\vrule height0.45\ht0\hss}\hbox
+to0pt{\kern0.55\wd0\vrule height0.5\ht0\hss}\box0}}
+{\setbox0=\hbox{$\textstyle \rm S$}\hbox{\raise0.5\ht0\hbox
+to0pt{\kern0.35\wd0\vrule height0.45\ht0\hss}\hbox
+to0pt{\kern0.55\wd0\vrule height0.5\ht0\hss}\box0}}
+{\setbox0=\hbox{$\scriptstyle \rm S$}\hbox{\raise0.5\ht0\hbox
+to0pt{\kern0.35\wd0\vrule height0.45\ht0\hss}\raise0.05\ht0\hbox
+to0pt{\kern0.5\wd0\vrule height0.45\ht0\hss}\box0}}
+{\setbox0=\hbox{$\scriptscriptstyle\rm S$}\hbox{\raise0.5\ht0\hbox
+to0pt{\kern0.4\wd0\vrule height0.45\ht0\hss}\raise0.05\ht0\hbox
+to0pt{\kern0.55\wd0\vrule height0.45\ht0\hss}\box0}}}}
+\def\bbbz{{\mathchoice {\hbox{$\mathsf\textstyle Z\kern-0.4em Z$}}
+{\hbox{$\mathsf\textstyle Z\kern-0.4em Z$}}
+{\hbox{$\mathsf\scriptstyle Z\kern-0.3em Z$}}
+{\hbox{$\mathsf\scriptscriptstyle Z\kern-0.2em Z$}}}}
+
+\let\ts\,
+
+\setlength\leftmargini address@hidden
+\setlength\leftmargin {\leftmargini}
+\setlength\leftmarginii {\leftmargini}
+\setlength\leftmarginiii {\leftmargini}
+\setlength\leftmarginiv {\leftmargini}
+\setlength \labelsep {.5em}
+\setlength \labelwidth{\leftmargini}
+\addtolength\labelwidth{-\labelsep}
+
address@hidden
+ \parsep 0\p@ address@hidden@ address@hidden@
+ \topsep 8\p@ address@hidden@ address@hidden@
+ address@hidden
address@hidden@listI
address@hidden
address@hidden {\leftmargin\leftmarginii
+ \labelwidth\leftmarginii
+ \advance\labelwidth-\labelsep
+ \topsep 0\p@ address@hidden@ address@hidden@}
address@hidden
+ \labelwidth\leftmarginiii
+ \advance\labelwidth-\labelsep
+ \topsep 0\p@ address@hidden@address@hidden@
+ \parsep \z@
+ \partopsep \p@ address@hidden@ address@hidden@}
+
+\renewcommand\labelitemi{\normalfont\bfseries --}
address@hidden
+
address@hidden
address@hidden
+
address@hidden
+ {{\contentsname}}}
+ address@hidden
+ \def\lastand{\ifnum\value{auco}=2\relax
+ \unskip{} \andname\
+ \else
+ \unskip \lastandname\
+ \fi}%
+ address@hidden
+ address@hidden
+ \lastand
+ \else
+ \unskip,
+ \fi}%
+ address@hidden@restonecol\twocolumn\fi}
+
address@hidden@secpenalty}%
+ \addvspace{2em address@hidden % space above part line
+ \begingroup
+ \parindent \z@
+ \rightskip \z@ plus 5em
+ \hrule\vskip5pt
+ \large % same size as for a contribution heading
+ \bfseries\boldmath % set line in boldface
+ \leavevmode % TeX command to enter horizontal mode.
+ #1\par
+ \vskip5pt
+ \hrule
+ \vskip1pt
+ \nobreak % Never break after part entry
+ \endgroup}
+
address@hidden
+
+\let\phantomsection=\relax
+
address@hidden@undefined\else
+{}\fi}
+
+\def\addnumcontentsmark#1#2#3{%
+\addtocontents{#1}{\protect\contentsline{#2}{\protect\numberline
+ {\thechapter}#3}{\thepage}\hyperhrefextend}}%
+\def\addcontentsmark#1#2#3{%
+\addtocontents{#1}{\protect\contentsline{#2}{#3}{\thepage}\hyperhrefextend}}%
+\def\addcontentsmarkwop#1#2#3{%
+\addtocontents{#1}{\protect\contentsline{#2}{#3}{0}\hyperhrefextend}}%
+
address@hidden #1 \or
address@hidden
+ \or address@hidden
+ \or address@hidden
+ address@hidden
+}
+\def\addtocmark{%
+\phantomsection
address@hidden@address@hidden
+}
+
address@hidden@highpenalty}
+ \vskip 1.0em plus 1pt address@hidden 1.5em \begingroup
+ \parindent \z@ \rightskip address@hidden
+ \advance\rightskip by 0pt plus 2cm
+ \parfillskip -\rightskip \pretolerance=10000
+ \leavevmode address@hidden \hskip -\leftskip
+ {\large\bfseries\boldmath#1}\ifx0#2\hfil\null
+ \else
+ \nobreak
+ address@hidden \mkern address@hidden mu.\mkern
+ address@hidden mu$}\hfill
+ \nobreak\hbox address@hidden #2}%
+ \fi\par
+ address@hidden \endgroup}
+
address@hidden@highpenalty}
+ \addvspace{8pt plus 1pt}
+ address@hidden \z@
+ \begingroup
+ \parindent \z@ \rightskip address@hidden
+ \advance\rightskip by 0pt plus 2cm
+ \parfillskip -\rightskip \pretolerance=10000
+ \leavevmode address@hidden \hskip -\leftskip
+ #1\nobreak
+ address@hidden \mkern address@hidden mu.\mkern
+ address@hidden mu$}\hfill
+ \nobreak\hbox address@hidden #2}\par
+ address@hidden \endgroup}
+
address@hidden@highpenalty}
+ address@hidden@ %\z@
+ \begingroup
+ \parindent \z@ \rightskip address@hidden
+ \advance\rightskip by 0pt plus 2cm
+ \pretolerance=10000
+ \leavevmode address@hidden %\hskip -\leftskip
+ \textit{#1}\par
+ address@hidden \endgroup}
+
+\setcounter{tocdepth}{0}
+\newdimen\tocchpnum
+\newdimen\tocsecnum
+\newdimen\tocsectotal
+\newdimen\tocsubsecnum
+\newdimen\tocsubsectotal
+\newdimen\tocsubsubsecnum
+\newdimen\tocsubsubsectotal
+\newdimen\tocparanum
+\newdimen\tocparatotal
+\newdimen\tocsubparanum
+\tocchpnum=\z@ % no chapter numbers
+\tocsecnum=15\p@ % section 88. plus 2.222pt
+\tocsubsecnum=23\p@ % subsection 88.8 plus 2.222pt
+\tocsubsubsecnum=27\p@ % subsubsection 88.8.8 plus 1.444pt
+\tocparanum=35\p@ % paragraph 88.8.8.8 plus 1.666pt
+\tocsubparanum=43\p@ % subparagraph 88.8.8.8.8 plus 1.888pt
+\def\calctocindent{%
+\tocsectotal=\tocchpnum
+\advance\tocsectotal by\tocsecnum
+\tocsubsectotal=\tocsectotal
+\advance\tocsubsectotal by\tocsubsecnum
+\tocsubsubsectotal=\tocsubsectotal
+\advance\tocsubsubsectotal by\tocsubsubsecnum
+\tocparatotal=\tocsubsubsectotal
+\advance\tocparatotal by\tocparanum}
+\calctocindent
+
address@hidden@dottedtocline{1}{\tocchpnum}{\tocsecnum}}
address@hidden@dottedtocline{2}{\tocsectotal}{\tocsubsecnum}}
address@hidden@dottedtocline{3}{\tocsubsectotal}{\tocsubsubsecnum}}
address@hidden@dottedtocline{4}{\tocsubsubsectotal}{\tocparanum}}
address@hidden@dottedtocline{5}{\tocparatotal}{\tocsubparanum}}
+
address@hidden@address@hidden
+ address@hidden
+ address@hidden@restonecol\twocolumn\fi}
address@hidden@dottedtocline{1}{0em}{1.5em}}
+
address@hidden@address@hidden
+ address@hidden
+ address@hidden@restonecol\twocolumn\fi}
address@hidden@figure
+
+\renewcommand\listoffigures{%
+ \section*{\listfigurename
+ address@hidden
+ address@hidden
+ }
+
+\renewcommand\listoftables{%
+ \section*{\listtablename
+ address@hidden
+ address@hidden
+ }
+
+\ifx\oribibl\undefined
+\ifx\citeauthoryear\undefined
+\renewenvironment{thebibliography}[1]
+ {\section*{\refname}
+ address@hidden
+ \small
+ address@hidden@address@hidden
+ address@hidden
+ \leftmargin\labelwidth
+ \advance\leftmargin\labelsep
+ address@hidden
+ \advance\leftmargin\bibindent
+ \itemindent -\bibindent
+ \listparindent \itemindent
+ \parsep \z@
+ \fi
+ \usecounter{enumiv}%
+ address@hidden@empty
+ address@hidden@enumiv}}%
+ address@hidden
+ \renewcommand\newblock{\par}%
+ \else
+ \renewcommand\newblock{\hskip .11em address@hidden address@hidden
+ \fi
+ \sloppy\clubpenalty4000\widowpenalty4000%
+ address@hidden
+ address@hidden
+ address@hidden@warning{Empty `thebibliography' environment}}%
+ \endlist}
address@hidden@filesw
+ {\let\protect\noexpand\immediate
+ address@hidden
address@hidden
address@hidden@address@hidden
+ address@hidden@address@hidden@address@hidden@address@hidden@citeb:=#2\do
+ address@hidden
+ address@hidden@address@hidden@address@hidden@address@hidden,}{\bfseries
+ address@hidden
+ {Citation address@hidden' on page \thepage \space undefined}}%
+ address@hidden@tempcntc0\csname address@hidden@citeb\endcsname\relax}%
+ address@hidden@ address@hidden@address@hidden
+ address@hidden@citea{,}\hbox{\csname address@hidden@citeb\endcsname}%
+ \else
+ address@hidden@ne
+ address@hidden@tempcntc
+ address@hidden@address@hidden
+ address@hidden@address@hidden@address@hidden
address@hidden@tempcnta>address@hidden
+ address@hidden@citea{,\,address@hidden
+ address@hidden@address@hidden
+ address@hidden@address@hidden@tempcntb \else
+ address@hidden
+ address@hidden@address@hidden@address@hidden
+\else
+\renewenvironment{thebibliography}[1]
+ {\section*{\refname}
+ \small
+ \list{}%
+ {\settowidth\labelwidth{}%
+ \leftmargin\parindent
+ \itemindent=-\parindent
+ \labelsep=\z@
+ address@hidden
+ \advance\leftmargin\bibindent
+ \itemindent -\bibindent
+ \listparindent \itemindent
+ \parsep \z@
+ \fi
+ \usecounter{enumiv}%
+ address@hidden@empty
+ \renewcommand\theenumiv{}}%
+ address@hidden
+ \renewcommand\newblock{\par}%
+ \else
+ \renewcommand\newblock{\hskip .11em address@hidden address@hidden
+ \fi
+ \sloppy\clubpenalty4000\widowpenalty4000%
+ address@hidden
+ address@hidden
+ address@hidden@warning{Empty `thebibliography' environment}}%
+ \endlist}
+ address@hidden
+ address@hidden@filesw
+ {\def\protect##1{\string ##1\space}\immediate
+ address@hidden
+ \fi
+\else
address@hidden@address@hidden
+\fi
+
+\def\idxquad{\hskip address@hidden space that divides entry from number
+
address@hidden address@hidden
+
+\def\subitem{\par\setbox0=\hbox{--\enspace}% second order
+ \noindent\hangindent\wd0\box0}% index entry
+
+\def\subsubitem{\par\setbox0=\hbox{--\,--\enspace}% third
+ \noindent\hangindent\wd0\box0}% order index entry
+
+\def\indexspace{\par \vskip 10\p@ plus5\p@ address@hidden
+
+\renewenvironment{theindex}
+ address@hidden
+ \thispagestyle{empty}\parindent\z@
+ \parskip\z@ address@hidden address@hidden
+ \let\item\par
+ \def\,{\relax\ifmmode\mskip\thinmuskip
+ \else\hskip0.2em\ignorespaces\fi}%
+ \normalfont\small
+ address@hidden
+ }
+ {\end{multicols}}
+
+\renewcommand\footnoterule{%
+ \kern-3\p@
+ address@hidden 2truecm
+ address@hidden
+ \newdimen\fnindent
+ \fnindent1em
address@hidden
+ \parindent \fnindent%
+ \leftskip \fnindent%
+ \noindent
+ address@hidden@address@hidden }}\ignorespaces#1}
+
address@hidden
+ \small
+ \vskip\abovecaptionskip
+ address@hidden #1.} #2}%
+ \ifdim address@hidden >\hsize
+ {\bfseries #1.} #2\par
+ \else
+ \global address@hidden
+ address@hidden@address@hidden
+ \fi
+ \vskip\belowcaptionskip}
+
address@hidden
address@hidden
+\def address@hidden {%
+ address@hidden
+ \small
+ address@hidden
+ address@hidden
+}
address@hidden
address@hidden
+\renewenvironment{table}
+ address@hidden
+ address@hidden
+ address@hidden
+ address@hidden
+\renewenvironment{table*}
+ address@hidden
+ address@hidden
+ address@hidden
+ address@hidden
+
address@hidden
+ address@hidden
+ the#1\endcsname}{\ignorespaces #2}}\begingroup
+ address@hidden
+ address@hidden address@hidden #3}\par
+ \endgroup}
+
+% LaTeX does not provide a command to enter the authors institute
+% addresses. The \institute command is defined here.
+
address@hidden
address@hidden
+\newcounter{auco}
+\newdimen\instindent
+\newbox\authrun
+\newtoks\authorrunning
+\newtoks\tocauthor
+\newbox\titrun
+\newtoks\titlerunning
+\newtoks\toctitle
+
address@hidden Author Given}%
+ address@hidden Title Given}%
+ address@hidden
+ address@hidden Institute Given}%
+ address@hidden
+ \global\titlerunning={}\global\authorrunning={}%
+ \global\toctitle={}\global\tocauthor={}}
+
address@hidden
+
+\def\institutename{\par
+ \begingroup
+ \parskip=\z@
+ \parindent=\z@
+ address@hidden
+ address@hidden
+ address@hidden
+ address@hidden
+ \ifnum\c@@inst=1\relax
+ \gdef\fnnstart{0}%
+ \else
+ \xdef\fnnstart{\c@@inst}%
+ address@hidden
+ address@hidden
+ \fi
+ \ignorespaces
+ address@hidden
+ \endgroup}
+
address@hidden
+ {\star\star\star}\or \dagger\or \ddagger\or
+ \mathchar "278\or \mathchar "27B\or \|\or **\or \dagger\dagger
+ \or \ddagger\ddagger address@hidden
+
+\def\inst#1{\unskip$^{#1}$}
+\def\fnmsep{\unskip$^,$}
+\def\email#1{{\tt#1}}
address@hidden
address@hidden
address@hidden@albion}}%
address@hidden@francais}}%
address@hidden@deutsch}}%
address@hidden@deutsch}}%
+}{\switcht@@therlang}%
+\providecommand{\keywords}[1]{\par\addvspace\baselineskip
+\noindent\keywordname\enspace\ignorespaces#1}%
+}
+\def\homedir{\~{ }}
+
address@hidden
+\clearheadinfo
+%
+%%% to avoid hyperref warnings
address@hidden
+%%% to make title-entry parent of section-entries
address@hidden
+%
+\renewcommand\maketitle{\newpage
+\phantomsection
+ \refstepcounter{chapter}%
+ \stepcounter{section}%
+ \setcounter{section}{0}%
+ \setcounter{subsection}{0}%
+ \setcounter{figure}{0}
+ \setcounter{table}{0}
+ \setcounter{equation}{0}
+ \setcounter{footnote}{0}%
+ \begingroup
+ \parindent=\z@
+ address@hidden@footnote}%
+ address@hidden
+ \ifnum address@hidden@ne
+ address@hidden
+ \else
+ address@hidden
+ \fi
+ \else
+ \newpage
+ address@hidden@ % Prevents figures from going at top of page.
+ address@hidden
+ \fi
+ address@hidden
+%
+ \def\\{\unskip\ \ignorespaces}\def\inst##1{\unskip{}}%
+ \def\thanks##1{\unskip{}}\def\fnmsep{\unskip}%
+ \instindent=\hsize
+ \advance\instindent by-\headlineindent
+ address@hidden
+ \addcontentsline{toc}{title}{\the\toctitle}\fi
+ address@hidden
+ \if!\the\titlerunning!\else
+ address@hidden
+ \fi
+ address@hidden
+ \ifdim\wd\titrun>\instindent
+ \typeout{Title too long for running head. Please supply}%
+ \typeout{a shorter form with \string\titlerunning\space prior to
+ \string\maketitle}%
+ \global\setbox\titrun=\hbox{\small\rm
+ Title Suppressed Due to Excessive Length}%
+ \fi
+ address@hidden
+ \fi
+%
+ \if!\the\tocauthor!\relax
+ {\def\and{\noexpand\protect\noexpand\and}%
+ address@hidden@address@hidden
+ \else
+ \def\\{\noexpand\protect\noexpand\newline}%
+ address@hidden
+ address@hidden@uthor{\scratch}%
+ \fi
+ address@hidden
+ address@hidden
+ address@hidden
+ \if!\the\authorrunning!
+ address@hidden@auth}%
+ address@hidden
+ \else
+ address@hidden
+ \fi
+ address@hidden
+ \ifdim\wd\authrun>\instindent
+ \typeout{Names of authors too long for running head. Please supply}%
+ \typeout{a shorter form with \string\authorrunning\space prior to
+ \string\maketitle}%
+ \global\setbox\authrun=\hbox{\small\rm
+ Authors Suppressed Due to Excessive Length}%
+ \fi
+ address@hidden
+ address@hidden@title}%
+ \fi
+ \endgroup
+ \setcounter{footnote}{\fnnstart}%
+ \clearheadinfo}
+%
address@hidden
+ \markboth{}{}%
+ address@hidden
+ \unskip{} \andname\
+ \else
+ \unskip \lastandname\
+ \fi}%
+ address@hidden
+ address@hidden@inst}%
+ \lastand
+ \else
+ \unskip,
+ \fi}%
+ \begin{center}%
+ \let\newline\\
+ {\Large \bfseries\boldmath
+ \pretolerance=10000
+ address@hidden \par}\vskip .8cm
address@hidden {\large \bfseries\boldmath
+ \vskip -.65cm
+ \pretolerance=10000
+ address@hidden \par}\vskip .8cm\fi
+ address@hidden@auth}}%
+ address@hidden
+ address@hidden@auth}%
+ address@hidden
+ address@hidden
+{\lineskip .5em
+\noindent\ignorespaces
address@hidden
+ {\small\institutename}
+ \end{center}%
+ }
+
+% definition of the "\spnewtheorem" command.
+%
+% Usage:
+%
+% \spnewtheorem{env_nam}{caption}[within]{cap_font}{body_font}
+% or \spnewtheorem{env_nam}[numbered_like]{caption}{cap_font}{body_font}
+% or \spnewtheorem*{env_nam}{caption}{cap_font}{body_font}
+%
+% New is "cap_font" and "body_font". It stands for
+% fontdefinition of the caption and the text itself.
+%
+% "\spnewtheorem*" gives a theorem without number.
+%
+% A defined spnewthoerem environment is used as described
+% by Lamport.
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
address@hidden
address@hidden
+
address@hidden@address@hidden
+
+% definition of \spnewtheorem with number
+
address@hidden
+ address@hidden@address@hidden
address@hidden@address@hidden@spnthm{#1}}}
+
address@hidden@ifdefinable\csname #1\endcsname
+ address@hidden@addtoreset{#1}{#3}%
+ \expandafter\xdef\csname the#1\endcsname{\expandafter\noexpand
+ \csname the#3\endcsname address@hidden address@hidden
+ \expandafter\xdef\csname #1name\endcsname{#2}%
+ address@hidden@spthm{#1}{\csname #1name\endcsname}{#4}{#5}}%
+ address@hidden@endtheorem}}}
+
address@hidden@ifdefinable\csname #1\endcsname
+ address@hidden
+ \expandafter\xdef\csname address@hidden
+ \expandafter\xdef\csname #1name\endcsname{#2}%
+ address@hidden@spthm{#1}{\csname #1name\endcsname}{#3}{#4}}%
+ address@hidden@endtheorem}}}
+
address@hidden
+ address@hidden@address@hidden theorem environment `#2' address@hidden
+ address@hidden #1\endcsname
+ {\newaliascnt{#1}{#2}%
+ \expandafter\xdef\csname #1name\endcsname{#3}%
+ address@hidden@spthm{#1}{\csname #1name\endcsname}{#4}{#5}}%
+ address@hidden@endtheorem}}}}
+
address@hidden 7\p@ address@hidden@ address@hidden@
+\refstepcounter{#1}%
address@hidden@address@hidden
+
address@hidden@spbegintheorem{#2}{\csname the#1\endcsname}{#3}{#4}%
+ \ignorespaces}
+
address@hidden@spopargbegintheorem{#2}{\csname
+ the#1\endcsname}{#5}{#3}{#4}\ignorespaces}
+
address@hidden
+ \item[\hskip\labelsep{#3#1\ address@hidden
+
address@hidden
+ \item[\hskip\labelsep{#4#1\ #2}]{#4(#3)address@hidden }#5}
+
+% definition of \spnewtheorem* without number
+
address@hidden@Ynthm{#1}{#2}}
+
address@hidden@ifdefinable\csname #1\endcsname
+ address@hidden@Thm{\csname #1name\endcsname}{#3}{#4}}%
+ \expandafter\xdef\csname #1name\endcsname{#2}%
+ address@hidden@endtheorem}}}
+
address@hidden 7\p@ address@hidden@ address@hidden@
address@hidden@address@hidden
+
address@hidden@Begintheorem{#1}{#2}{#3}\ignorespaces}
+
address@hidden@Opargbegintheorem{#1}
+ {#4}{#2}{#3}\ignorespaces}
+
address@hidden
+ address@hidden
+
address@hidden
+ \item[\hskip\labelsep{#3#1}]{#3(#2)address@hidden }}
+
address@hidden
+ address@hidden
+ \spnewtheorem{theorem}{Theorem}[section]{\bfseries}{\itshape}
+\else
+ \spnewtheorem{theorem}{Theorem}{\bfseries}{\itshape}
+ address@hidden
+ address@hidden
+ \else
+ address@hidden
+ \fi
+\fi
+
+%definition of divers theorem environments
+\spnewtheorem*{claim}{Claim}{\itshape}{\rmfamily}
+\spnewtheorem*{proof}{Proof}{\itshape}{\rmfamily}
address@hidden % alle Umgebungen wie Theorem.
+ address@hidden@spothm{#1}[theorem]{#2}{#3}{#4}}
+\else % alle Umgebungen mit eigenem Zaehler
+ address@hidden % mit section numeriert
+ address@hidden@spxnthm{#1}{#2}[section]{#3}{#4}}
+ \else % nicht mit section numeriert
+ address@hidden
+ address@hidden@spynthm{#1}{#2}{#3}{#4}
+ address@hidden
+ \else
+ address@hidden@spynthm{#1}{#2}{#3}{#4}
+ address@hidden
+ \fi
+ \fi
+\fi
address@hidden
address@hidden
address@hidden
address@hidden
address@hidden
address@hidden
address@hidden
address@hidden
address@hidden
address@hidden
address@hidden
address@hidden
address@hidden
address@hidden
+
address@hidden
+ address@hidden
+ address@hidden@elt
+ address@hidden
+ address@hidden
+ address@hidden@tempb\else
+ address@hidden
+ \fi}%
+ address@hidden address@hidden
+ \expandafter\def\csname address@hidden
+ address@hidden
+ address@hidden@tempd}
+
address@hidden
+ \item[\hskip\labelsep{##4##1\ address@hidden }##5}
+ address@hidden
+ address@hidden }}
+ }
+
+\renewenvironment{abstract}{%
+ \list{}{\advance\topsep by0.35cm\relax\small
+ \leftmargin=1cm
+ \labelwidth=\z@
+ \listparindent=\z@
+ \itemindent\listparindent
+ \rightmargin\leftmargin}\item[\hskip\labelsep
+ \bfseries\abstractname]}
+ {\endlist}
+
+\newdimen\headlineindent % dimension for space between
+\headlineindent=1.166cm % number and text of headings.
+
address@hidden@address@hidden
+ address@hidden@address@hidden@empty
+ address@hidden
+ \leftmark\hfil}
+ address@hidden
+ \llap{\thepage}}
+ \def\chaptermark##1{}%
+ \def\sectionmark##1{}%
+ \def\subsectionmark##1{}}
+
address@hidden@address@hidden
+ address@hidden@address@hidden@empty
+ address@hidden
+ \hfil}
+ address@hidden
+ \llap{\thepage}}
+ \def\chaptermark##1{}%
+ \def\sectionmark##1{}%
+ \def\subsectionmark##1{}}
+
address@hidden@headings\else
address@hidden
+
address@hidden
address@hidden
+
+\endinput
+%end of file llncs.cls
diff --git a/doc/reppar-2015/outline.org b/doc/reppar-2015/outline.org
new file mode 100644
index 0000000..6a1903a
--- /dev/null
+++ b/doc/reppar-2015/outline.org
@@ -0,0 +1,168 @@
+#+TITLE: Free and Happy Users --- Reproducible and User-Controlled Package
Management in HPC with GNU Guix
+
+* Introduction
+
+** Idea
+
+ 1. HPC cluster distros are old, not customizable, and sysadmin policy
+ is often conservative ("don't touch anything")
+ 2. users resort to manual or "overlay" package management -> badly
+ affects reproducibility
+ 3. solutions being developed don't guarantee reproducibility, prevent
+ sharing among users, which in turn prevents reproducibility
+ 4. use of Guix helps maximize reproducibility while allowing sharing
+ among users, both on the same cluster on in different environments
+ 5. we present concrete use cases
+ 6. define reproducibility:
+ 1. for one user at different times
+ 2. among users of a cluster at a given time
+ 3. among users on different machines, at different times
+
+* Common HPC Practice Hinders Reproducibility
+
+ - reproducible research approaches don't address this
+ + "A Universal Identifier for Computational Results" doesn't take
+ reproducibility into account
+ + "Effective Reproducible Research with Org-Mode and Git"
+ (Section 4) suggests either a vague approach (record version
+ numbers of a few packages) or a heavyweight approach (use VMs)
+ + some give up too easily: cf.
[[https://www.xsede.org/documents/659353/703287/xsede14_fahey.pdf][Reproducibility
responsibilities in the HPC arena]]
+ - single HPC users may find themselves unable to reproduce their own
+ results
+ + sysadmin-managed "modules", can disappear/change anytime
+ + thus, keeping binaries in $HOME isn't enough
+ - cluster users can hardly share with other users on the same cluster
+ + copy binaries? fragile, and prevents customization
+ + hard to have shared deployments
+ - HPC users can hardly share the software with other clusters
+ + different cluster means different software (compilers, libraries,
+ etc.)
+ + makes it difficult to assess the impact of a given architecture on
+ the software
+
+* Related Work
+
+** historical package managers
+
+ - dpkg, apt, rpm, etc.
+ + not flexible (hard to write or customize recipes)
+ + binaries uploaded by maintainers (optional)
+ + package databases cannot be composed in the case of rpm
([[gnus:nnimap%2Binria:address@hidden email
+ from Ricardo]])
+
+** at the other end of the spectrum: VMs & containers
+
+ - full deployments: G5K/Kadeploy
+ + slow, does not compose
+ + imposes a significant burden on users: choosing and preparing
+ complete images
+ - VMs (cf. "SHARE: a web portal for creating and sharing executable
+ research papers")
+ + heavyweight
+ + unsuitable for HPC
+ - containers (Docker et al.)
+ + unavailable to unprivileged users in HPC
+ + heavyweight, coarse-grain, not composable
+ + yet:
[[http://www.hpcadvisorycouncil.com/events/2015/swiss-workshop/pdf/day1/7_QNIB.pdf]["Immutable
Application Containers"]] by "HPC Advisory Council"
+ (cf. http://doc.qnib.org/HPCAC2015.pdf)
+
+** unprivileged package management & customizability
+
+ - GNU Stow
+ - Conda & [[https://github.com/hpcugent/easybuild][EasyBuild]]
+ + co-existence of versions/builds via different prefixes
+ + EasyBuild: lots of efforts spent on ad hoc module naming convention
+ + recipes are Python objects, eases customization
+ + EasyBuild is mostly for "HPC support teams"
+ - [[http://scalability-llnl.github.io/spack/][Spack]]
+ + highly customizable from the command line + API
+ + thought with HPC-style usage in mind
+ + uses external tools, which prevents reproducibility
([[https://groups.google.com/forum/#!topic/spack/NxyNTAZyMQg][example]])
+ - Gitian, reproducible.debian.net
+
+* Functional Package Managers
+
+ - Nix & Guix
+ - reproducibility is goal #1
+ + containers, etc.
+ + (cite that paper on influence of env. vars on OpenMP performance?)
+ + reproducibility implies free software
+ - usual stuff
+
+* Use Cases
+
+ - reproducible profiles: different levels
+ + symbolic: 'guix package --manifest'
+ + binary: 'guix archive --export'
+ - reproducibility
+ + users choose when and what to upgrade
+ + whole DAG can be saved/restored anytime
+ + contrast with sysadmin-managed packages & modules
+ + storage resources shared
+ - contrast with Spack, EasyBuild, etc.
+ + build environment tightly controlled (containers)
+ + rollback, etc.
+ + different levels of reproducibility:
+ * exact: a specific branch of Guix
+ * symbolic: an externally-maintained package set
+ + workflow: publish Guix branch or external package set
+ - deployment of complex stacks
+ + example1: bioinfo at U. Berlin
+ + example2:
[[http://www.ict-openlab.eu/fileadmin/documents/public_deliverables/OpenLab_Deliverable_D2_9.pdf][OpenLab
deliverable D.29]] (GNUnet)
+ + describe specific challenges...
+ - deployment + customization of the software stack (off topic?)
+ + example: [[http://icl.cs.utk.edu/projectsdev/morse/][MORSE]]
+ + 12+ actively developed, tightly-integrated packages
+ + people want to be able to the specific part they work on (hwloc,
+ StarPU, solver, etc.) while still being able to deploy the whole
+ stack
+ + makes it easy to assess the performance impact of a specific part
+ of the stack (e.g., StarPU)
+ + 'guix environment'
+ - "active/executable papers" (?)
+ + integrate with Skribilo or Org-mode (cf. "The Collage Authoring
+ Environment", 2011)
+
+* Limitations & Challenges
+
+ - needs to be installed by cluster sysadmin
+ - remaining sources of non-determinism
+ + cpuid, /proc/cpuinfo, etc.
+ + profile-driven optimization
+ + build system non-determinism ("make -j" with broken makefiles)
+ + non-determinism due to scheduling (cf. "Determinism and
+ Reproducibility in Large-Scale HPC Systems")
+ - numerical library tuning (ATLAS, etc.)
+ + configured on the build machine, which may undermine
+ reproducibility (see above)
+ + binaries become non-portable
+ + tweaking the recipe of say, ATLAS, means rebuilding a large part
+ of the DAG
+ - software "archeology" is limited
+ + reusing specific, old versions of compilers or libraries means
+ rewriting those recipes (they may have never existed in Guix
+ itself since it's relatively young)
+ - use of Guix on all cluster nodes?
+ + daemon, substitutes, network access, etc.
+ - numerical reproducibility? (cf. "Designing Bit-Reproducible Portable
+ High-Performance Applications")
+ - no proprietary software
+ + but this is a strength: reproducible science cannot be built on
+ black boxes, and experimentation needs the ability to fiddle with
+ the software
+
+* Conclusion
+
+ - functional package management & Guix make users happy
+
+* References
+
+ - https://khinsen.wordpress.com/category/science/reproducible-research/
+ +
[[https://dirac.cnrs-orleans.fr/plone/software/activepapers][ActivePapers]]
(CNRS Orléans, Konrad Hinsen)
+ * refers to [[http://www.executablepapers.com/][Elsevier's executable
papers]]
+ +
[[https://khinsen.wordpress.com/2012/05/14/the-nix-package-manager-in-computational-science/][Nix
in computational science]]
+ - [[http://hpcugent.github.io/easybuild/files/hust14_paper.pdf][Modern
Scientific Software Management Using EasyBuild and Lmod]]
+
+* COMMENT Emacs stuff
+
+LocalWords: reproducibility workflow
diff --git a/doc/reppar-2015/reproducible-hpc.skb
b/doc/reppar-2015/reproducible-hpc.skb
new file mode 100644
index 0000000..484da79
--- /dev/null
+++ b/doc/reppar-2015/reproducible-hpc.skb
@@ -0,0 +1,441 @@
+(eval-when (expand load eval)
+ ;; Augment the search path so that both the examples and the Guix
+ ;; modules are found.
+ (let ((file (assoc-ref (current-source-location) 'filename)))
+ (for-each (lambda (dir)
+ (set! %load-path (cons dir %load-path))
+ (set! %load-compiled-path
+ (cons dir %load-compiled-path)))
+ (list (string-append (getenv "HOME") "/.config/guix/latest")
+ (string-append (dirname file) "/code")))))
+
+(use-modules (skribilo package lncs)
+ (skribilo engine latex)
+ (skribilo biblio author)
+ (skribilo source)
+ (skribilo source lisp)
+ (skribilo engine)
+ (skribilo writer)
+ (skribilo ast)
+ (skribilo evaluator)
+ (guix packages) (guix derivations)
+ ((guix store) #:prefix guix:)
+ (my-openmpi))
+
+(define %store
+ ;; Connection to the Guix build daemon. Is that reasonable to do
+ ;; it here? Are we supposed to be reasonable anyway?
+ (guix:open-connection))
+
+(define (---) ; emdash
+ (resolve (lambda (n e env)
+ (if (engine-format? "html" e)
+ (! "—")
+ "---"))))
+
+(define (--) ; endash
+ (resolve (lambda (n e env)
+ (if (engine-format? "html" e)
+ (! "–")
+ "--"))))
+
+(define (include-latex file)
+ (! (format #f "\n\\input{~a}\n" file)))
+
+;; Abbreviate author first names.
+(markup-writer '&bib-entry-author
+ :action (lambda (n e)
+ (let ((names (markup-body n)))
+ (evaluate-document
+ (if (string? names)
+ (abbreviate-first-names names)
+ names)
+ e))))
+
+(bibliography "../els-2013/guix.sbib")
+(bibliography "reppar.sbib")
+
+(let* ((latex (find-engine 'latex))
+ (usep (engine-custom latex 'usepackage)))
+ (engine-custom-set! latex 'usepackage
+ (string-append usep "
+\\usepackage{tikz}
+\\usetikzlibrary{arrows,shapes,trees,shadows,positioning}
+\\usepackage{fancyvrb}
+
+% Remember the position of every picture.
+\\tikzstyle{every picture}+=[remember picture]
+")))
+
+
+(document :title [Reproducible and User-Controlled
+Software Environments in HPC with Guix]
+ :author (list (author :name "Ludovic Courtès"
+ :affiliation "Inria"
+ :address (list "Bordeaux, France"))
+ (author :name "Ricardo Wurmus"
+ :affiliation "Max Delbrück Center for Molecular
+ Medicine in the Helmholtz Association"
+ :address (list "Berlin, Germany"))
+ ;; + others...
+ )
+
+ (abstract
+ [Support teams of high-performance computing (HPC) systems often
+find themselves between a rock and hard place: on one hand, they
+understandably administrate these large systems in a conservative way,
+but on the other hand, they try to satisfy their users by deploying
+up-to-date tool chains as well as libraries and scientific software.
+HPC system users often have no guarantee that they will be able to
+reproduce results at a later point in time, even on the same
+system,(---)software may have been upgraded, removed, or recompiled
+under their feet,(---), and they have little hope of being able to
+reproduce the same software environment elsewhere. We present
+GNU,(~)Guix and the functional package management paradigm and claim
+that it can improve reproducibility and sharing among researchers,
+illustrating with representative use cases.])
+
+ (chapter :title [Introduction]
+
+ (p [HPC system administration has to satisfy two seemingly
+contradictory demands: on one hand administrators seek stability, which
+leads to a very conservative approach to software management, and on the
+other users demand recent tool chains and huge scientific software
+stacks. In addition, users often need different versions and different
+variants of a given software package. To satisfy both, support teams
+always play the role of ``distribution maintainers'': they build and
+install tool chains, libraries, and scientific software packages
+manually,(---)multiple variants thereof,(---)and make them available
+,(it [via]) ``environment modules'',(ref :bib 'furlani91:modules), which
+allows users to pick the specific packages they want.])
+ (p [Unfortunately, software is often built and installed in an
+,(it [ad hoc]) fashion, leaving users little hope of redeploying the
+same software environment on another system. Worse, support teams
+occasionally have to remove installed software or to upgrade it in
+place, which means that users may eventually find themselves unable to
+reproduce their software environment, ,(emph [even on the same
+system]).])
+ (p [Recently-developed tools such as EasyBuild ,(ref :bib
+'geimer2014:easybuild) address part of the problem by automating package
+builds, enforcing some conventions on installation directories, and
+integrating with environment modules. Spack ,(ref :bib
+'gamblin:spack-web) goes further by seeking usability by unprivileged
+users and by adding facilities to create package variants. However,
+these tools fall short when it comes to build reproducibility. First,
+the build environment is loosely controlled by environment variables,
+and build processes can trivially refer to tools or libraries available
+in the surrounding environment, which defeats reproducibility. Second,
+the ,(it [ad hoc]) naming conventions they rely on to identify builds
+fail to capture the directed acyclic graph (DAG) of dependencies that
+led to this particular build (see ,(numref :text [Section] :ident
+"related")).])
+ (p [GNU,(~)Guix is a general-purpose package manager that
+implements the functional package management paradigm pioneered by Nix
+,(ref :bib '(dolstra2004:nix courtes2013:functional)). Many of its
+properties and features make it attractive in a multi-user HPC context:
+per-user profiles, transactional upgrades and roll-backs, and, more
+importantly, a controlled build environment to maximize reproducibility.
+,(numref :text [Section] :ident "rationale") details our motivations.
+,(numref :text [Section] :ident "functional") describes the functional
+package management paradigm, its implementation in Guix, its impact on
+reproducibility, and how it can be applied to HPC systems. ,(numref
+:text [Section] :ident "use-cases") gives concrete use cases where Guix
+empowers users while guaranteeing reproducibility and sharing, while
+,(numref :text [Section] :ident "limitations") discusses limitations and
+remaining challenges. Finally, ,(numref :text [Section] :ident
+"related") compares to related work, and ,(numref :text [Section] :ident
+"conclusion") concludes.]))
+
+ (chapter :title [Rationale] :ident "rationale"
+
+ (p [Recent work on reproducible research insufficiently takes
+software environment reproducibility into account. For example, the
+approach for verifiable computational results described in ,(ref :bib
+'gavish2011:universal) focuses on workflows and conventions but does not
+mention the difficulty of reproducing full software environments.
+Likewise, the authors of ,(ref :bib 'stanisic2014:effective) propose a
+methodology for reproducible research experiments in HPC. To address
+the software-environment reproducibility problem they propose two
+extreme and equally unsatisfying approaches: one is to write down the
+version numbers of the dependencies being used, which is insufficient,
+and the other is to save and reuse full virtual machines, which poses a
+real challenge for performance.])
+ (p [Yet, common practices on HPC systems hinder reproducibility.
+The vast majority of HPC systems run GNU/Linux but for understandable
+stability reasons, they often run old distributions that are rarely
+updated. Thus, packages provided by the distribution are largely
+dismissed, and instead support teams install packages by
+themselves,(---)from scientific software, to HPC libraries, to compiler
+tool chains,(---)and make them available through environment modules
+,(ref :bib 'furlani91:modules). Modules allow users to choose different
+versions or variants of the packages they use without interfering with
+each others. However, when installed software is updated in place or
+removed, users suddenly find themselves unable to reproduce the software
+environment they were using. Given these practices, reproducing the
+exact same software environment on a ,(emph [different]) HPC system
+seems out of reach. It is nonetheless a very important property: it
+would allow users to assess the impact of the hardware on the software's
+performance,(---)something that is very valuable in particular for
+developers of run-time systems such as StarPU ,(ref :bib
+'augonnet2009:starpu),(---), and it would allow other researchers to
+reproduce experiments on their system.])
+ (p [Essentially, by deploying software and environment modules,
+HPC support teams find themselves duplicating the work of GNU/Linux
+distributions, but why is that? Historical package managers such as
+Debian's APT were introduced as a way to (1) allow distribution makers
+to describe the dependencies and ``build recipe'' of a package to
+automate builds, and (2) to allow users to easily install, upgrade, and
+remove packages without having to worry about dependencies and build
+systems. However, these traditional package managers suffer from
+several limitations.])
+ (p [First, package binaries that every user installs (for
+instance, the ,(code [.deb]) files) are actually built on the package
+maintainer's machine, which then uploads it. Because the package's
+build process has access to all the machine's file system and resources,
+details may leak into the binary that is uploaded. Thus, chances are
+than another user would not be able to reproduce the exact same binary.
+It is worth noting that this particular issue is being addressed in the
+context of Debian by the Reproducible project ,(ref :bib
+'debian-reproducible-web).])
+ (p [Second, while it is in theory possible for a user to define
+their own variant of a package, as is often needed in HPC, this happens
+to be often difficult in practice. ,(bold [FIXME: Expound.])])
+ (p [Third, APT, RPM, and similar tools implement an ,(emph
+[imperative]) and ,(emph [stateful]) package management model, as Doltra
+et al. rightfully explained in ,(ref :bib 'dolstra2004:nix). It is
+imperative in the sense that it modifies the set of available packages
+in place. For example, upgrading libc means that suddenly all the
+installed packages start using the new libc version; switching to an
+alternative MPI implementation, or upgrading the OpenMP run-time library
+means that suddenly all the installed applications and libraries start
+using them. It is stateful in the sense that the system state after a
+package management operation depends on its previous state. Namely, the
+system state at a given point in time is the result of the series of
+installation and upgrade operations that have been made over time, and
+there may be no way to reproduce the exact same state elsewhere. These
+properties are a serious hindrance to reproducibility.]))
+
+ (chapter :title [Functional Package Management] :ident "functional"
+
+ (p [,(it [Functional paradigm.]) Functional package management is
+a discipline that transcribes the functional programming paradigm to
+software deployment: build and installation processes are viewed as pure
+functions in the mathematical sense,(---)whose result depends
+exclusively on the inputs,(---), and their result is a value,(---)that
+is, an immutable directory. Since build and installation processes are
+pure functions, their results can effectively be ``cached'' on
+disk,(---)just like one can ``memoize'' pure functions. Likewise, two
+independent runs of a given build process for a given set of inputs
+should return the same value,(---),(it [i.e.]), a set of bit-identical
+files. This approach was first described and implemented in the Nix
+package manager ,(ref :bib 'dolstra2004:nix). Guix reuses low-level
+mechanism from Nix to implement the same paradigm, but offers a unified
+interface for package definitions and their implementation, all embedded
+in a single programming language ,(ref :bib 'courtes2013:functional).])
+ (p [An obvious challenge is the implementation of this paradigm:
+how can build and install processes be viewed as pure? To obtain that
+property, Nix and Guix ensure tight control over the build environment.
+In both cases, build processes are started by a privileged daemon that
+always runs them in ``containers'' as implemented by the kernel Linux;
+that is, they run in a chroot environment, under a dedicated user ID,
+with separate name spaces for PIDs, inter-process communication (IPC),
+networking, and so on. The chroot environment is prepared to contained
+only the directories corresponding to the inputs that the build process
+explicitly declared. This ensures that the build process cannot
+inadvertently end up using tools or libraries that it is not supposed to
+use. The separate name spaces ensure that the build process cannot
+communicate with the outside world. And of course, the set of
+environment variables visible in the build processes is well-defined.
+Although it is not perfect as we will see in ,(numref :text [Section]
+:ident "limitations"), this technique gives us confidence that builds
+processes can be viewed as pure functions, with reproducible results.])
+
+ (figure
+ :legend [Invocation of the ,(tt [guix build]) command returning
+ the resulting file name in the store.]
+ :ident "fig-build"
+
+ ;;(include-latex "fig-build.tex")
+ (bold [FIXME: imagine a figure here]))
+
+ (p [Each build process produces one or more files in directories
+stored in a common place called ,(emph [the store]), typically the ,(tt
+[/gnu/store]) directory. Each file in ,(tt [/gnu/store]) has a name
+that includes a hash of all the inputs of the build process that led to
+it, as shown in ,(numref :text [Figure] :ident "fig-build"). By ``all
+the inputs'', we really mean all of them: this includes of course
+compilers and libraries (including the C library), but also build
+scripts and environment variable values. And this is recursive, the
+compiler's own directory name is a hash of the tools and libraries used
+to build, and so on and so forth, until a set a pre-built binaries used
+for bootstrapping purposes,(---)and which can in turn be rebuilt using
+Guix ,(ref :bib 'courtes2013:functional). Thus, for each package that
+is built, the system has access to the ,(emph [complete DAG]) of
+dependencies used to build it, recursively.])
+
+ (figure
+ :legend [Guix package recipe of Open,(~)MPI.]
+ :ident "fig-recipe"
+
+ (prog
+ (source :language scheme :file "code/my-openmpi.scm"
+ :definition 'openmpi)))
+
+ (p [Package recipes in Guix are written in a domain-specific
+language (DSL) embedded in the Scheme programming language. ,(numref
+:text [Figure] :ident "fig-recipe") shows, as an example, the recipe to
+build the Open,(~)MPI library, which should be intelligible to the
+reader. The ,(tt [package]) form evaluates to a ,(emph [package
+object]), which is just a ``regular'' Scheme object; the ,(tt [define])
+form defines the ,(tt [openmpi]) variable to hold that value. Because
+this is a standard Scheme object, we can query it programmatically, as
+shown in ,(numref :text [Figure] :ident "fig-query").])
+
+ (figure
+ :legend [Querying a package object using the programming interface.]
+ :ident "fig-query"
+
+ (prog :mark #f
+ (source :language scheme :file "code/query-package.scm"
+ :start ";;!start"))
+
+ (p [... yields:])
+
+ (prog :line #f
+ (source :language scheme
+ (object->string (primitive-load "code/query-package.scm")))))
+
+ (p [Important parts include line ,(ref :line
+"recipe-build-system"), which specifies that the package is to be built
+according to the GNU build system convention,(---),(it [i.e.]), using
+the well-known ,(tt [./configure && make && make install]) sequence.
+The ,(tt [inputs]) field on line ,(ref :line "recipe-inputs") specifies
+the direct dependencies of the package (the difference between these two
+fields is only relevant when cross-compiling.) The field refers to the
+,(tt [hwloc]), ,(tt [gfortran-4.8]), and ,(tt [pkg-config]) variables,
+which are also bound to package objects (their definition is not shown
+here.) It would be inconvenient to specify all the standard inputs,
+such as GNU,(~)Make, GCC, GNU,(~)Binutils so these are implicit here.
+Since we are manipulating ``normal'' Scheme objects, we can use the API
+of Guix to query those package objects, as illustrated with the code in
+,(numref :text [Figure] :ident "fig-query"), which queries the name and
+version of the direct and indirect dependencies of our package,(footnote
+[This code is actually run as we build this document, as we will see in
+,(numref :text [Section] :ident "active").]).])
+ (p [With that definition in place, running ,(tt [guix build
+openmpi]) returns the directory name
+,(tt (derivation->output-path (package-derivation %store openmpi))). If
+that directory did not already exist, then the daemon spawns the build
+process in its isolated environment with write access to this directory.
+Of course users never have to type these long ,(tt [/gnu/store]) file
+names. They can install the package in their ,(emph [profile]) using
+the ,(tt [guix package]) command, which essentially installs symbolic
+links under ,(tt [~/.guix-profile]). It is then a matter of defining
+the search paths for the compiler, linker, and other tools ,(tt [via])
+environment variables. Fortunately, Guix keeps track of that and the
+,(tt [guix package --search-paths]) command returns all the necessary
+environment variable definitions in Bourne shell syntax. For example,
+when both the GCC tool chain and Open,(~)MPI are installed, the command
+returns definitions for the ,(tt [PATH]), ,(tt [CPATH]), and ,(tt
+[LIBRARY_PATH]) environment variables, and these definitions can be
+passed to the ,(tt [eval]) shell built-in command.]))
+
+ (chapter :title [Use Cases] :ident "use-cases"
+
+ (p [We explore practical use cases where the availability of Guix
+can improve experimentation reproducibility for a user of a given
+system, support the deployment of complex software stacks, allow a
+software environment to be replicated on another system, and allow
+fine customization of the software environment, and finally integrate
+tightly with the production of research papers.])
+
+ (section :title [Usage Patterns on an HPC Cluster] ;MDC Berlin
+
+ (p [One of the key features of Guix and Nix is that they
+securely permit unprivileged users to install packages in the store
+,(ref :bib 'dolstra2004:nix). To build a package, the ,(tt [guix])
+commands connect to the build daemon, which then performs the build (if
+needed) on their behalf, in the isolated, unprivileged environment.
+When two users build the exact same package, both end up using the exact
+same ,(tt [/gnu/store]) file name and storage is shared. If a user
+tries to build, say, a malicious version of the C library, then the
+other users on the system will not use it, simply because they cannot
+guess its ,(tt [/gnu/store]) file name in the first place,(---)unless
+they themselves explicitly build the very same modified C library.])
+ (p (bold [FIXME: insert MDC experience report here?]))
+
+ (figure
+ :legend [Declaring the set of packages to be installed in a
+ profile.]
+ :ident "fig-manifest"
+
+ (prog :line #f
+ (source :language scheme :file "code/manifest.scm")))
+
+ (p [Guix users have a default profile in ,(tt
+[~/.guix-profile]),(---)essentially a tree of symlinks to selected items
+in ,(tt [/gnu/store]),(---)but they can create independent profiles in
+arbitrary places of the file system. Guix supports two ways to manage a
+profile. The first one is to make transactions that add, upgrade, or
+remove packages in the profile: ,(tt [guix package --install openmpi
+--remove mpich2]) installs Open,(~)MPI and remove MPICH2 from ,(tt
+[~/.guix-profile]) in a single transaction that can be rolled back. The
+second approach is to ,(emph [declare]) the desired contents of the
+profile and make that effective: the user writes in a file a code
+snippet that lists the requested packages (see ,(numref :text [Figure]
+:ident "fig-manifest")) and then runs ,(tt [guix package
+--manifest=my-packages.scm]).])
+ (p [This declarative profile management makes it easy to
+replicate a profile, but it is symbolic: it uses whatever package
+objects the variables are bound to (,(tt [gnu-make]), ,(tt
+[gcc-toolchain]), etc.), but these variables are typically defined in
+the ,(tt [(gnu packages ...)]) modules that Guix comes with. Thus the
+precise packages being installed depend on the revision of Guix that is
+available. Specifying the Guix revision,(footnote [Guix itself is
+versioned-controlled using Git.]) in addition to the declaration in
+,(numref :text [Figure] :ident "fig-manifest") is all it takes to
+reproduce the exact same ,(tt [/gnu/store]) items.])
+ (p [Another approach to achieve bit-identical reproduction of a
+user's profile is by saving the contents of its closure using ,(tt [guix
+archive --export]). The resulting archive can be transferred to another
+system and restored at any point in time using ,(tt [guix archive
+--import]). This should significantly facilitate experimentation and
+sharing among peers.]))
+
+ (section :title [Customizing Packages] ;MORSE
+
+ )
+
+ (section :title [Going Further] ;active papers
+ :ident "active"))
+
+ (chapter :title [Limitations and Challenges]
+ :ident "limitations"
+
+ (p [Nix and Guix address many of the reproducibility issues
+encountered in package deployment, and Guix provides APIs and a
+programming environment aiming to facilitate the development of package
+variants as is useful in HPC. Yet, to our knowledge, neither Guix nor
+Nix are widely deployed on HPC systems. An obvious reason that limits
+adoption is the requirement to have the build daemon run with root
+privileges,(---)without which it would not be able to use the Linux
+kernel container facilities that allow it to isolate build processes and
+maximize build reproducibility. System administrators are wary of
+installing privileged daemons, and so HPC system users trade
+reproducibility for practical approaches.])
+ )
+
+ (chapter :title [Related Work] :ident "related")
+
+ (chapter :title [Conclusion] :ident "conclusion")
+
+ (references)
+ )
+
+;; Local Variables:
+;; compile-command: "skribilo -t latex -o reproducible-hpc.tex
reproducible-hpc.skb && pdflatex reproducible-hpc.tex"
+;; ispell-local-dictionary: "american"
+;; indent-tabs-mode: nil
+;; End:
+
+;; LocalWords: reproducibility workflows
- 38/45: reppar: Slightly shrink the conclusion, and thank Eric., (continued)
- 38/45: reppar: Slightly shrink the conclusion, and thank Eric., Ludovic Courtès, 2015/06/09
- 41/45: reppar: Move the discussion of multiple profiles earlier; add example., Ludovic Courtès, 2015/06/09
- 29/45: reppar: Comment out the section about active papers., Ludovic Courtès, 2015/06/09
- 40/45: reppar: Mention ACM TOMS, as suggested by Eric., Ludovic Courtès, 2015/06/09
- 42/45: reppar: Shrink the part about yumdb., Ludovic Courtès, 2015/06/09
- 37/45: reppar: Add missing parenthesis, as reported by Eric Bavier., Ludovic Courtès, 2015/06/09
- 43/45: reppar: Mention the packages used at MDC., Ludovic Courtès, 2015/06/09
- 36/45: reppar: Tweak the wording regarding MDC., Ludovic Courtès, 2015/06/09
- 26/45: reppar: Shrink various parts., Ludovic Courtès, 2015/06/09
- 45/45: reppar: Assorted fixes and nitpicking from Andreas., Ludovic Courtès, 2015/06/09
- 02/45: Add the beginnings of a RepPar 2015 paper.,
Ludovic Courtès <=
- 44/45: reppar: Fix reading flow., Ludovic Courtès, 2015/06/09
- 39/45: reppar: Remove line numbers for "fig-query"., Ludovic Courtès, 2015/06/09