Skip to content
Snippets Groups Projects
Commit e8566357 authored by Erick Lavoie's avatar Erick Lavoie
Browse files

Initial commit

parents
No related branches found
No related tags found
No related merge requests found
.DS_Store
figures/.DS_Store
*.aux
*.bbl
*.blg
*.log
*.out
*.pdf
*.synctex.gz
File added
figures/d-cliques-cifar10-vs-1-node-training-loss.png

141 KiB

figures/d-cliques-cifar10-vs-1-node-validation-accuracy.png

89.9 KiB

File added
figures/fully-connected-IID-vs-non-IID.png

54.7 KiB

File added
figures/grid-IID-vs-non-IID.png

115 KiB

figures/grid-iid-neighbourhood.png

18.7 KiB

figures/grid-non-iid-neighbourhood.png

14.2 KiB

figures/ring-IID-vs-non-IID.png

86.5 KiB

llncs.cls 0 → 100644
% LLNCS DOCUMENT CLASS -- version 2.20 (10-Mar-2018)
% 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}[2018/03/10 v2.20
^^J LaTeX document class for Lecture Notes in Computer Science]
% Options
\let\if@envcntreset\iffalse
\DeclareOption{envcountreset}{\let\if@envcntreset\iftrue}
\DeclareOption{citeauthoryear}{\let\citeauthoryear=Y}
\DeclareOption{oribibl}{\let\oribibl=Y}
\let\if@custvec\iftrue
\DeclareOption{orivec}{\let\if@custvec\iffalse}
\let\if@envcntsame\iffalse
\DeclareOption{envcountsame}{\let\if@envcntsame\iftrue}
\let\if@envcntsect\iffalse
\DeclareOption{envcountsect}{\let\if@envcntsect\iftrue}
\let\if@runhead\iffalse
\DeclareOption{runningheads}{\let\if@runhead\iftrue}
\let\if@openright\iftrue
\let\if@openbib\iffalse
\DeclareOption{openbib}{\let\if@openbib\iftrue}
% languages
\let\switcht@@therlang\relax
\def\ds@deutsch{\def\switcht@@therlang{\switcht@deutsch}}
\def\ds@francais{\def\switcht@@therlang{\switcht@francais}}
\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}
\renewcommand\@pnumwidth{2em}
\renewcommand\@tocrmarg{3.5em}
%
\def\@dottedtocline#1#2#3#4#5{%
\ifnum #1>\c@tocdepth \else
\vskip \z@ \@plus.2\p@
{\leftskip #2\relax \rightskip \@tocrmarg \advance\rightskip by 0pt plus 2cm
\parfillskip -\rightskip \pretolerance=10000
\parindent #2\relax\@afterindenttrue
\interlinepenalty\@M
\leavevmode
\@tempdima #3\relax
\advance\leftskip \@tempdima \null\nobreak\hskip -\leftskip
{#4}\nobreak
\leaders\hbox{$\m@th
\mkern \@dotsep mu\hbox{.}\mkern \@dotsep
mu$}\hfill
\nobreak
\hb@xt@\@pnumwidth{\hfil\normalfont \normalcolor #5}%
\par}%
\fi}
%
\def\switcht@albion{%
\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}}
\switcht@albion
% Names of theorem like environments are already defined
% but must be translated if another language is chosen
%
% French section
\def\switcht@francais{%\typeout{On 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
\def\switcht@deutsch{%\typeout{Man 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
\def\thisbottomragged{\def\@textbottom{\vskip\z@ plus.0001fil
\global\let\@textbottom\relax}}
\renewcommand\small{%
\@setfontsize\small\@ixpt{11}%
\abovedisplayskip 8.5\p@ \@plus3\p@ \@minus4\p@
\abovedisplayshortskip \z@ \@plus2\p@
\belowdisplayshortskip 4\p@ \@plus2\p@ \@minus2\p@
\def\@listi{\leftmargin\leftmargini
\parsep 0\p@ \@plus1\p@ \@minus\p@
\topsep 8\p@ \@plus2\p@ \@minus4\p@
\itemsep0\p@}%
\belowdisplayskip \abovedisplayskip
}
\frenchspacing
\widowpenalty=10000
\clubpenalty=10000
\setlength\oddsidemargin {63\p@}
\setlength\evensidemargin {63\p@}
\setlength\marginparwidth {90\p@}
\setlength\headsep {16\p@}
\setlength\footnotesep{7.7\p@}
\setlength\textfloatsep{8mm\@plus 2\p@ \@minus 4\p@}
\setlength\intextsep {8mm\@plus 2\p@ \@minus 2\p@}
\setcounter{secnumdepth}{2}
\newcounter {chapter}
\renewcommand\thechapter {\@arabic\c@chapter}
\newif\if@mainmatter \@mainmattertrue
\newcommand\frontmatter{\cleardoublepage
\@mainmatterfalse\pagenumbering{Roman}}
\newcommand\mainmatter{\cleardoublepage
\@mainmattertrue\pagenumbering{arabic}}
\newcommand\backmatter{\if@openright\cleardoublepage\else\clearpage\fi
\@mainmatterfalse}
\renewcommand\part{\cleardoublepage
\thispagestyle{empty}%
\if@twocolumn
\onecolumn
\@tempswatrue
\else
\@tempswafalse
\fi
\null\vfil
\secdef\@part\@spart}
\def\@part[#1]#2{%
\ifnum \c@secnumdepth >-2\relax
\refstepcounter{part}%
\addcontentsline{toc}{part}{\thepart\hspace{1em}#1}%
\else
\addcontentsline{toc}{part}{#1}%
\fi
\markboth{}{}%
{\centering
\interlinepenalty \@M
\normalfont
\ifnum \c@secnumdepth >-2\relax
\huge\bfseries \partname~\thepart
\par
\vskip 20\p@
\fi
\Huge \bfseries #2\par}%
\@endpart}
\def\@spart#1{%
{\centering
\interlinepenalty \@M
\normalfont
\Huge \bfseries #1\par}%
\@endpart}
\def\@endpart{\vfil\newpage
\if@twoside
\null
\thispagestyle{empty}%
\newpage
\fi
\if@tempswa
\twocolumn
\fi}
\newcommand\chapter{\clearpage
\thispagestyle{empty}%
\global\@topnum\z@
\@afterindentfalse
\secdef\@chapter\@schapter}
\def\@chapter[#1]#2{\ifnum \c@secnumdepth >\m@ne
\if@mainmatter
\refstepcounter{chapter}%
\typeout{\@chapapp\space\thechapter.}%
\addcontentsline{toc}{chapter}%
{\protect\numberline{\thechapter}#1}%
\else
\addcontentsline{toc}{chapter}{#1}%
\fi
\else
\addcontentsline{toc}{chapter}{#1}%
\fi
\chaptermark{#1}%
\addtocontents{lof}{\protect\addvspace{10\p@}}%
\addtocontents{lot}{\protect\addvspace{10\p@}}%
\if@twocolumn
\@topnewpage[\@makechapterhead{#2}]%
\else
\@makechapterhead{#2}%
\@afterheading
\fi}
\def\@makechapterhead#1{%
% \vspace*{50\p@}%
{\centering
\ifnum \c@secnumdepth >\m@ne
\if@mainmatter
\large\bfseries \@chapapp{} \thechapter
\par\nobreak
\vskip 20\p@
\fi
\fi
\interlinepenalty\@M
\Large \bfseries #1\par\nobreak
\vskip 40\p@
}}
\def\@schapter#1{\if@twocolumn
\@topnewpage[\@makeschapterhead{#1}]%
\else
\@makeschapterhead{#1}%
\@afterheading
\fi}
\def\@makeschapterhead#1{%
% \vspace*{50\p@}%
{\centering
\normalfont
\interlinepenalty\@M
\Large \bfseries #1\par\nobreak
\vskip 40\p@
}}
\renewcommand\section{\@startsection{section}{1}{\z@}%
{-18\p@ \@plus -4\p@ \@minus -4\p@}%
{12\p@ \@plus 4\p@ \@minus 4\p@}%
{\normalfont\large\bfseries\boldmath
\rightskip=\z@ \@plus 8em\pretolerance=10000 }}
\renewcommand\subsection{\@startsection{subsection}{2}{\z@}%
{-18\p@ \@plus -4\p@ \@minus -4\p@}%
{8\p@ \@plus 4\p@ \@minus 4\p@}%
{\normalfont\normalsize\bfseries\boldmath
\rightskip=\z@ \@plus 8em\pretolerance=10000 }}
\renewcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}%
{-18\p@ \@plus -4\p@ \@minus -4\p@}%
{-0.5em \@plus -0.22em \@minus -0.1em}%
{\normalfont\normalsize\bfseries\boldmath}}
\renewcommand\paragraph{\@startsection{paragraph}{4}{\z@}%
{-12\p@ \@plus -4\p@ \@minus -4\p@}%
{-0.5em \@plus -0.22em \@minus -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
\if@custvec
\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 {17\p@}
\setlength\leftmargin {\leftmargini}
\setlength\leftmarginii {\leftmargini}
\setlength\leftmarginiii {\leftmargini}
\setlength\leftmarginiv {\leftmargini}
\setlength \labelsep {.5em}
\setlength \labelwidth{\leftmargini}
\addtolength\labelwidth{-\labelsep}
\def\@listI{\leftmargin\leftmargini
\parsep 0\p@ \@plus1\p@ \@minus\p@
\topsep 8\p@ \@plus2\p@ \@minus4\p@
\itemsep0\p@}
\let\@listi\@listI
\@listi
\def\@listii {\leftmargin\leftmarginii
\labelwidth\leftmarginii
\advance\labelwidth-\labelsep
\topsep 0\p@ \@plus2\p@ \@minus\p@}
\def\@listiii{\leftmargin\leftmarginiii
\labelwidth\leftmarginiii
\advance\labelwidth-\labelsep
\topsep 0\p@ \@plus\p@\@minus\p@
\parsep \z@
\partopsep \p@ \@plus\z@ \@minus\p@}
\renewcommand\labelitemi{\normalfont\bfseries --}
\renewcommand\labelitemii{$\m@th\bullet$}
\setlength\arraycolsep{1.4\p@}
\setlength\tabcolsep{1.4\p@}
\def\tableofcontents{\chapter*{\contentsname\@mkboth{{\contentsname}}%
{{\contentsname}}}
\def\authcount##1{\setcounter{auco}{##1}\setcounter{@auth}{1}}
\def\lastand{\ifnum\value{auco}=2\relax
\unskip{} \andname\
\else
\unskip \lastandname\
\fi}%
\def\and{\stepcounter{@auth}\relax
\ifnum\value{@auth}=\value{auco}%
\lastand
\else
\unskip,
\fi}%
\@starttoc{toc}\if@restonecol\twocolumn\fi}
\def\l@part#1#2{\addpenalty{\@secpenalty}%
\addvspace{2em plus\p@}% % 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}
\def\@dotsep{2}
\let\phantomsection=\relax
\def\hyperhrefextend{\ifx\hyper@anchor\@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}}%
\def\@adcmk[#1]{\ifcase #1 \or
\def\@gtempa{\addnumcontentsmark}%
\or \def\@gtempa{\addcontentsmark}%
\or \def\@gtempa{\addcontentsmarkwop}%
\fi\@gtempa{toc}{chapter}%
}
\def\addtocmark{%
\phantomsection
\@ifnextchar[{\@adcmk}{\@adcmk[3]}%
}
\def\l@chapter#1#2{\addpenalty{-\@highpenalty}
\vskip 1.0em plus 1pt \@tempdima 1.5em \begingroup
\parindent \z@ \rightskip \@tocrmarg
\advance\rightskip by 0pt plus 2cm
\parfillskip -\rightskip \pretolerance=10000
\leavevmode \advance\leftskip\@tempdima \hskip -\leftskip
{\large\bfseries\boldmath#1}\ifx0#2\hfil\null
\else
\nobreak
\leaders\hbox{$\m@th \mkern \@dotsep mu.\mkern
\@dotsep mu$}\hfill
\nobreak\hbox to\@pnumwidth{\hss #2}%
\fi\par
\penalty\@highpenalty \endgroup}
\def\l@title#1#2{\addpenalty{-\@highpenalty}
\addvspace{8pt plus 1pt}
\@tempdima \z@
\begingroup
\parindent \z@ \rightskip \@tocrmarg
\advance\rightskip by 0pt plus 2cm
\parfillskip -\rightskip \pretolerance=10000
\leavevmode \advance\leftskip\@tempdima \hskip -\leftskip
#1\nobreak
\leaders\hbox{$\m@th \mkern \@dotsep mu.\mkern
\@dotsep mu$}\hfill
\nobreak\hbox to\@pnumwidth{\hss #2}\par
\penalty\@highpenalty \endgroup}
\def\l@author#1#2{\addpenalty{\@highpenalty}
\@tempdima=15\p@ %\z@
\begingroup
\parindent \z@ \rightskip \@tocrmarg
\advance\rightskip by 0pt plus 2cm
\pretolerance=10000
\leavevmode \advance\leftskip\@tempdima %\hskip -\leftskip
\textit{#1}\par
\penalty\@highpenalty \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
\def\l@section{\@dottedtocline{1}{\tocchpnum}{\tocsecnum}}
\def\l@subsection{\@dottedtocline{2}{\tocsectotal}{\tocsubsecnum}}
\def\l@subsubsection{\@dottedtocline{3}{\tocsubsectotal}{\tocsubsubsecnum}}
\def\l@paragraph{\@dottedtocline{4}{\tocsubsubsectotal}{\tocparanum}}
\def\l@subparagraph{\@dottedtocline{5}{\tocparatotal}{\tocsubparanum}}
\def\listoffigures{\@restonecolfalse\if@twocolumn\@restonecoltrue\onecolumn
\fi\section*{\listfigurename\@mkboth{{\listfigurename}}{{\listfigurename}}}
\@starttoc{lof}\if@restonecol\twocolumn\fi}
\def\l@figure{\@dottedtocline{1}{0em}{1.5em}}
\def\listoftables{\@restonecolfalse\if@twocolumn\@restonecoltrue\onecolumn
\fi\section*{\listtablename\@mkboth{{\listtablename}}{{\listtablename}}}
\@starttoc{lot}\if@restonecol\twocolumn\fi}
\let\l@table\l@figure
\renewcommand\listoffigures{%
\section*{\listfigurename
\@mkboth{\listfigurename}{\listfigurename}}%
\@starttoc{lof}%
}
\renewcommand\listoftables{%
\section*{\listtablename
\@mkboth{\listtablename}{\listtablename}}%
\@starttoc{lot}%
}
\ifx\oribibl\undefined
\ifx\citeauthoryear\undefined
\renewenvironment{thebibliography}[1]
{\section*{\refname}
\def\@biblabel##1{##1.}
\small
\list{\@biblabel{\@arabic\c@enumiv}}%
{\settowidth\labelwidth{\@biblabel{#1}}%
\leftmargin\labelwidth
\advance\leftmargin\labelsep
\if@openbib
\advance\leftmargin\bibindent
\itemindent -\bibindent
\listparindent \itemindent
\parsep \z@
\fi
\usecounter{enumiv}%
\let\p@enumiv\@empty
\renewcommand\theenumiv{\@arabic\c@enumiv}}%
\if@openbib
\renewcommand\newblock{\par}%
\else
\renewcommand\newblock{\hskip .11em \@plus.33em \@minus.07em}%
\fi
\sloppy\clubpenalty4000\widowpenalty4000%
\sfcode`\.=\@m}
{\def\@noitemerr
{\@latex@warning{Empty `thebibliography' environment}}%
\endlist}
\def\@lbibitem[#1]#2{\item[{[#1]}\hfill]\if@filesw
{\let\protect\noexpand\immediate
\write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces}
\newcount\@tempcntc
\def\@citex[#1]#2{\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi
\@tempcnta\z@\@tempcntb\m@ne\def\@citea{}\@cite{\@for\@citeb:=#2\do
{\@ifundefined
{b@\@citeb}{\@citeo\@tempcntb\m@ne\@citea\def\@citea{,}{\bfseries
?}\@warning
{Citation `\@citeb' on page \thepage \space undefined}}%
{\setbox\z@\hbox{\global\@tempcntc0\csname b@\@citeb\endcsname\relax}%
\ifnum\@tempcntc=\z@ \@citeo\@tempcntb\m@ne
\@citea\def\@citea{,}\hbox{\csname b@\@citeb\endcsname}%
\else
\advance\@tempcntb\@ne
\ifnum\@tempcntb=\@tempcntc
\else\advance\@tempcntb\m@ne\@citeo
\@tempcnta\@tempcntc\@tempcntb\@tempcntc\fi\fi}}\@citeo}{#1}}
\def\@citeo{\ifnum\@tempcnta>\@tempcntb\else
\@citea\def\@citea{,\,\hskip\z@skip}%
\ifnum\@tempcnta=\@tempcntb\the\@tempcnta\else
{\advance\@tempcnta\@ne\ifnum\@tempcnta=\@tempcntb \else
\def\@citea{--}\fi
\advance\@tempcnta\m@ne\the\@tempcnta\@citea\the\@tempcntb}\fi\fi}
\else
\renewenvironment{thebibliography}[1]
{\section*{\refname}
\small
\list{}%
{\settowidth\labelwidth{}%
\leftmargin\parindent
\itemindent=-\parindent
\labelsep=\z@
\if@openbib
\advance\leftmargin\bibindent
\itemindent -\bibindent
\listparindent \itemindent
\parsep \z@
\fi
\usecounter{enumiv}%
\let\p@enumiv\@empty
\renewcommand\theenumiv{}}%
\if@openbib
\renewcommand\newblock{\par}%
\else
\renewcommand\newblock{\hskip .11em \@plus.33em \@minus.07em}%
\fi
\sloppy\clubpenalty4000\widowpenalty4000%
\sfcode`\.=\@m}
{\def\@noitemerr
{\@latex@warning{Empty `thebibliography' environment}}%
\endlist}
\def\@cite#1{#1}%
\def\@lbibitem[#1]#2{\item[]\if@filesw
{\def\protect##1{\string ##1\space}\immediate
\write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces}
\fi
\else
\@cons\@openbib@code{\noexpand\small}
\fi
\def\idxquad{\hskip 10\p@}% space that divides entry from number
\def\@idxitem{\par\hangindent 10\p@}
\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@ minus3\p@\relax}
\renewenvironment{theindex}
{\@mkboth{\indexname}{\indexname}%
\thispagestyle{empty}\parindent\z@
\parskip\z@ \@plus .3\p@\relax
\let\item\par
\def\,{\relax\ifmmode\mskip\thinmuskip
\else\hskip0.2em\ignorespaces\fi}%
\normalfont\small
\begin{multicols}{2}[\@makeschapterhead{\indexname}]%
}
{\end{multicols}}
\renewcommand\footnoterule{%
\kern-3\p@
\hrule\@width 2truecm
\kern2.6\p@}
\newdimen\fnindent
\fnindent1em
\long\def\@makefntext#1{%
\parindent \fnindent%
\leftskip \fnindent%
\noindent
\llap{\hb@xt@1em{\hss\@makefnmark\ }}\ignorespaces#1}
\long\def\@makecaption#1#2{%
\small
\vskip\abovecaptionskip
\sbox\@tempboxa{{\bfseries #1.} #2}%
\ifdim \wd\@tempboxa >\hsize
{\bfseries #1.} #2\par
\else
\global \@minipagefalse
\hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
\fi
\vskip\belowcaptionskip}
\def\fps@figure{htbp}
\def\fnum@figure{\figurename\thinspace\thefigure}
\def \@floatboxreset {%
\reset@font
\small
\@setnobreak
\@setminipage
}
\def\fps@table{htbp}
\def\fnum@table{\tablename~\thetable}
\renewenvironment{table}
{\setlength\abovecaptionskip{0\p@}%
\setlength\belowcaptionskip{10\p@}%
\@float{table}}
{\end@float}
\renewenvironment{table*}
{\setlength\abovecaptionskip{0\p@}%
\setlength\belowcaptionskip{10\p@}%
\@dblfloat{table}}
{\end@dblfloat}
\long\def\@caption#1[#2]#3{\par\addcontentsline{\csname
ext@#1\endcsname}{#1}{\protect\numberline{\csname
the#1\endcsname}{\ignorespaces #2}}\begingroup
\@parboxrestore
\@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par
\endgroup}
% LaTeX does not provide a command to enter the authors institute
% addresses. The \institute command is defined here.
\newcounter{@inst}
\newcounter{@auth}
\newcounter{auco}
\newdimen\instindent
\newbox\authrun
\newtoks\authorrunning
\newtoks\tocauthor
\newbox\titrun
\newtoks\titlerunning
\newtoks\toctitle
\def\clearheadinfo{\gdef\@author{No Author Given}%
\gdef\@title{No Title Given}%
\gdef\@subtitle{}%
\gdef\@institute{No Institute Given}%
\gdef\@thanks{}%
\global\titlerunning={}\global\authorrunning={}%
\global\toctitle={}\global\tocauthor={}}
\def\institute#1{\gdef\@institute{#1}}
\def\institutename{\par
\begingroup
\parskip=\z@
\parindent=\z@
\setcounter{@inst}{1}%
\def\and{\par\stepcounter{@inst}%
\noindent$^{\the@inst}$\enspace\ignorespaces}%
\setbox0=\vbox{\def\thanks##1{}\@institute}%
\ifnum\c@@inst=1\relax
\gdef\fnnstart{0}%
\else
\xdef\fnnstart{\c@@inst}%
\setcounter{@inst}{1}%
\noindent$^{\the@inst}$\enspace
\fi
\ignorespaces
\@institute\par
\endgroup}
\def\@fnsymbol#1{\ensuremath{\ifcase#1\or\star\or{\star\star}\or
{\star\star\star}\or \dagger\or \ddagger\or
\mathchar "278\or \mathchar "27B\or \|\or **\or \dagger\dagger
\or \ddagger\ddagger \else\@ctrerr\fi}}
\def\inst#1{\unskip$^{#1}$}
\def\orcidID#1{\unskip$^{[#1]}$} % added MR 2018-03-10
\def\fnmsep{\unskip$^,$}
\def\email#1{{\tt#1}}
\AtBeginDocument{\@ifundefined{url}{\def\url#1{#1}}{}%
\@ifpackageloaded{babel}{%
\@ifundefined{extrasenglish}{}{\addto\extrasenglish{\switcht@albion}}%
\@ifundefined{extrasfrenchb}{}{\addto\extrasfrenchb{\switcht@francais}}%
\@ifundefined{extrasgerman}{}{\addto\extrasgerman{\switcht@deutsch}}%
\@ifundefined{extrasngerman}{}{\addto\extrasngerman{\switcht@deutsch}}%
}{\switcht@@therlang}%
\providecommand{\keywords}[1]{\def\and{{\textperiodcentered} }%
\par\addvspace\baselineskip
\noindent\keywordname\enspace\ignorespaces#1}%
\@ifpackageloaded{hyperref}{%
\def\doi#1{\href{https://doi.org/#1}{https://doi.org/#1}}}{
\def\doi#1{https://doi.org/#1}}
}
\def\homedir{\~{ }}
\def\subtitle#1{\gdef\@subtitle{#1}}
\clearheadinfo
%
%%% to avoid hyperref warnings
\providecommand*{\toclevel@author}{999}
%%% to make title-entry parent of section-entries
\providecommand*{\toclevel@title}{0}
%
\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@
\renewcommand\thefootnote{\@fnsymbol\c@footnote}%
\if@twocolumn
\ifnum \col@number=\@ne
\@maketitle
\else
\twocolumn[\@maketitle]%
\fi
\else
\newpage
\global\@topnum\z@ % Prevents figures from going at top of page.
\@maketitle
\fi
\thispagestyle{empty}\@thanks
%
\def\\{\unskip\ \ignorespaces}\def\inst##1{\unskip{}}%
\def\thanks##1{\unskip{}}\def\fnmsep{\unskip}%
\instindent=\hsize
\advance\instindent by-\headlineindent
\if!\the\toctitle!\addcontentsline{toc}{title}{\@title}\else
\addcontentsline{toc}{title}{\the\toctitle}\fi
\if@runhead
\if!\the\titlerunning!\else
\edef\@title{\the\titlerunning}%
\fi
\global\setbox\titrun=\hbox{\small\rm\unboldmath\ignorespaces\@title}%
\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
\xdef\@title{\copy\titrun}%
\fi
%
\if!\the\tocauthor!\relax
{\def\and{\noexpand\protect\noexpand\and}%
\def\inst##1{}% added MR 2017-09-20 to remove inst numbers from the TOC
\def\orcidID##1{}% added MR 2017-09-20 to remove ORCID ids from the TOC
\protected@xdef\toc@uthor{\@author}}%
\else
\def\\{\noexpand\protect\noexpand\newline}%
\protected@xdef\scratch{\the\tocauthor}%
\protected@xdef\toc@uthor{\scratch}%
\fi
\addtocontents{toc}{\noexpand\protect\noexpand\authcount{\the\c@auco}}%
\addcontentsline{toc}{author}{\toc@uthor}%
\if@runhead
\if!\the\authorrunning!
\value{@inst}=\value{@auth}%
\setcounter{@auth}{1}%
\else
\edef\@author{\the\authorrunning}%
\fi
\global\setbox\authrun=\hbox{\def\inst##1{}% added MR 2017-09-20 to remove inst numbers from the runninghead
\def\orcidID##1{}% added MR 2017-09-20 to remove ORCID ids from the runninghead
\small\unboldmath\@author\unskip}%
\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
\xdef\@author{\copy\authrun}%
\markboth{\@author}{\@title}%
\fi
\endgroup
\setcounter{footnote}{\fnnstart}%
\clearheadinfo}
%
\def\@maketitle{\newpage
\markboth{}{}%
\def\lastand{\ifnum\value{@inst}=2\relax
\unskip{} \andname\
\else
\unskip \lastandname\
\fi}%
\def\and{\stepcounter{@auth}\relax
\ifnum\value{@auth}=\value{@inst}%
\lastand
\else
\unskip,
\fi}%
\begin{center}%
\let\newline\\
{\Large \bfseries\boldmath
\pretolerance=10000
\@title \par}\vskip .8cm
\if!\@subtitle!\else {\large \bfseries\boldmath
\vskip -.65cm
\pretolerance=10000
\@subtitle \par}\vskip .8cm\fi
\setbox0=\vbox{\setcounter{@auth}{1}\def\and{\stepcounter{@auth}}%
\def\thanks##1{}\@author}%
\global\value{@inst}=\value{@auth}%
\global\value{auco}=\value{@auth}%
\setcounter{@auth}{1}%
{\lineskip .5em
\noindent\ignorespaces
\@author\vskip.35cm}
{\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.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\@thmcountersep{}
\def\@thmcounterend{.}
\def\spnewtheorem{\@ifstar{\@sthm}{\@Sthm}}
% definition of \spnewtheorem with number
\def\@spnthm#1#2{%
\@ifnextchar[{\@spxnthm{#1}{#2}}{\@spynthm{#1}{#2}}}
\def\@Sthm#1{\@ifnextchar[{\@spothm{#1}}{\@spnthm{#1}}}
\def\@spxnthm#1#2[#3]#4#5{\expandafter\@ifdefinable\csname #1\endcsname
{\@definecounter{#1}\@addtoreset{#1}{#3}%
\expandafter\xdef\csname the#1\endcsname{\expandafter\noexpand
\csname the#3\endcsname \noexpand\@thmcountersep \@thmcounter{#1}}%
\expandafter\xdef\csname #1name\endcsname{#2}%
\global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#4}{#5}}%
\global\@namedef{end#1}{\@endtheorem}}}
\def\@spynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname
{\@definecounter{#1}%
\expandafter\xdef\csname the#1\endcsname{\@thmcounter{#1}}%
\expandafter\xdef\csname #1name\endcsname{#2}%
\global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#3}{#4}}%
\global\@namedef{end#1}{\@endtheorem}}}
\def\@spothm#1[#2]#3#4#5{%
\@ifundefined{c@#2}{\@latexerr{No theorem environment `#2' defined}\@eha}%
{\expandafter\@ifdefinable\csname #1\endcsname
{\newaliascnt{#1}{#2}%
\expandafter\xdef\csname #1name\endcsname{#3}%
\global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#4}{#5}}%
\global\@namedef{end#1}{\@endtheorem}}}}
\def\@spthm#1#2#3#4{\topsep 7\p@ \@plus2\p@ \@minus4\p@
\refstepcounter{#1}%
\@ifnextchar[{\@spythm{#1}{#2}{#3}{#4}}{\@spxthm{#1}{#2}{#3}{#4}}}
\def\@spxthm#1#2#3#4{\@spbegintheorem{#2}{\csname the#1\endcsname}{#3}{#4}%
\ignorespaces}
\def\@spythm#1#2#3#4[#5]{\@spopargbegintheorem{#2}{\csname
the#1\endcsname}{#5}{#3}{#4}\ignorespaces}
\def\@spbegintheorem#1#2#3#4{\trivlist
\item[\hskip\labelsep{#3#1\ #2\@thmcounterend}]#4}
\def\@spopargbegintheorem#1#2#3#4#5{\trivlist
\item[\hskip\labelsep{#4#1\ #2}]{#4(#3)\@thmcounterend\ }#5}
% definition of \spnewtheorem* without number
\def\@sthm#1#2{\@Ynthm{#1}{#2}}
\def\@Ynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname
{\global\@namedef{#1}{\@Thm{\csname #1name\endcsname}{#3}{#4}}%
\expandafter\xdef\csname #1name\endcsname{#2}%
\global\@namedef{end#1}{\@endtheorem}}}
\def\@Thm#1#2#3{\topsep 7\p@ \@plus2\p@ \@minus4\p@
\@ifnextchar[{\@Ythm{#1}{#2}{#3}}{\@Xthm{#1}{#2}{#3}}}
\def\@Xthm#1#2#3{\@Begintheorem{#1}{#2}{#3}\ignorespaces}
\def\@Ythm#1#2#3[#4]{\@Opargbegintheorem{#1}
{#4}{#2}{#3}\ignorespaces}
\def\@Begintheorem#1#2#3{#3\trivlist
\item[\hskip\labelsep{#2#1\@thmcounterend}]}
\def\@Opargbegintheorem#1#2#3#4{#4\trivlist
\item[\hskip\labelsep{#3#1}]{#3(#2)\@thmcounterend\ }}
\if@envcntsect
\def\@thmcountersep{.}
\spnewtheorem{theorem}{Theorem}[section]{\bfseries}{\itshape}
\else
\spnewtheorem{theorem}{Theorem}{\bfseries}{\itshape}
\if@envcntreset
\@addtoreset{theorem}{section}
\else
\@addtoreset{theorem}{chapter}
\fi
\fi
%definition of divers theorem environments
\spnewtheorem*{claim}{Claim}{\itshape}{\rmfamily}
\spnewtheorem*{proof}{Proof}{\itshape}{\rmfamily}
\if@envcntsame % alle Umgebungen wie Theorem.
\def\spn@wtheorem#1#2#3#4{\@spothm{#1}[theorem]{#2}{#3}{#4}}
\else % alle Umgebungen mit eigenem Zaehler
\if@envcntsect % mit section numeriert
\def\spn@wtheorem#1#2#3#4{\@spxnthm{#1}{#2}[section]{#3}{#4}}
\else % nicht mit section numeriert
\if@envcntreset
\def\spn@wtheorem#1#2#3#4{\@spynthm{#1}{#2}{#3}{#4}
\@addtoreset{#1}{section}}
\else
\def\spn@wtheorem#1#2#3#4{\@spynthm{#1}{#2}{#3}{#4}
\@addtoreset{#1}{chapter}}%
\fi
\fi
\fi
\spn@wtheorem{case}{Case}{\itshape}{\rmfamily}
\spn@wtheorem{conjecture}{Conjecture}{\itshape}{\rmfamily}
\spn@wtheorem{corollary}{Corollary}{\bfseries}{\itshape}
\spn@wtheorem{definition}{Definition}{\bfseries}{\itshape}
\spn@wtheorem{example}{Example}{\itshape}{\rmfamily}
\spn@wtheorem{exercise}{Exercise}{\itshape}{\rmfamily}
\spn@wtheorem{lemma}{Lemma}{\bfseries}{\itshape}
\spn@wtheorem{note}{Note}{\itshape}{\rmfamily}
\spn@wtheorem{problem}{Problem}{\itshape}{\rmfamily}
\spn@wtheorem{property}{Property}{\itshape}{\rmfamily}
\spn@wtheorem{proposition}{Proposition}{\bfseries}{\itshape}
\spn@wtheorem{question}{Question}{\itshape}{\rmfamily}
\spn@wtheorem{solution}{Solution}{\itshape}{\rmfamily}
\spn@wtheorem{remark}{Remark}{\itshape}{\rmfamily}
\def\@takefromreset#1#2{%
\def\@tempa{#1}%
\let\@tempd\@elt
\def\@elt##1{%
\def\@tempb{##1}%
\ifx\@tempa\@tempb\else
\@addtoreset{##1}{#2}%
\fi}%
\expandafter\expandafter\let\expandafter\@tempc\csname cl@#2\endcsname
\expandafter\def\csname cl@#2\endcsname{}%
\@tempc
\let\@elt\@tempd}
\def\theopargself{\def\@spopargbegintheorem##1##2##3##4##5{\trivlist
\item[\hskip\labelsep{##4##1\ ##2}]{##4##3\@thmcounterend\ }##5}
\def\@Opargbegintheorem##1##2##3##4{##4\trivlist
\item[\hskip\labelsep{##3##1}]{##3##2\@thmcounterend\ }}
}
\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.
\def\ps@headings{\let\@mkboth\@gobbletwo
\let\@oddfoot\@empty\let\@evenfoot\@empty
\def\@evenhead{\normalfont\small\rlap{\thepage}\hspace{\headlineindent}%
\leftmark\hfil}
\def\@oddhead{\normalfont\small\hfil\rightmark\hspace{\headlineindent}%
\llap{\thepage}}
\def\chaptermark##1{}%
\def\sectionmark##1{}%
\def\subsectionmark##1{}}
\def\ps@titlepage{\let\@mkboth\@gobbletwo
\let\@oddfoot\@empty\let\@evenfoot\@empty
\def\@evenhead{\normalfont\small\rlap{\thepage}\hspace{\headlineindent}%
\hfil}
\def\@oddhead{\normalfont\small\hfil\hspace{\headlineindent}%
\llap{\thepage}}
\def\chaptermark##1{}%
\def\sectionmark##1{}%
\def\subsectionmark##1{}}
\if@runhead\ps@headings\else
\ps@empty\fi
\setlength\arraycolsep{1.4\p@}
\setlength\tabcolsep{1.4\p@}
\endinput
%end of file llncs.cls
main.bib 0 → 100644
@article{tibshirani1996regression,
title={Regression shrinkage and selection via the lasso},
author={Tibshirani, Robert},
journal={Journal of the Royal Statistical Society. Series B (Methodological)},
pages={267--288},
year={1996},
publisher={JSTOR}
}
@article{candes2009exact,
title={Exact matrix completion via convex optimization},
author={Cand{\`e}s, Emmanuel J and Recht, Benjamin},
journal={Foundations of Computational mathematics},
volume={9},
number={6},
pages={717--772},
year={2009},
publisher={Springer}
}
@article{candes2010power,
title={The power of convex relaxation: Near-optimal matrix completion},
author={Cand{\`e}s, Emmanuel J and Tao, Terence},
journal={IEEE Transactions on Information Theory},
volume={56},
number={5},
pages={2053--2080},
year={2010},
publisher={IEEE}
}
@article{recht2011simpler,
title={A simpler approach to matrix completion},
author={Recht, Benjamin},
journal={Journal of Machine Learning Research},
volume={12},
number={Dec},
pages={3413--3430},
year={2011}
}
@article{gross2010quantum,
title={Quantum state tomography via compressed sensing},
author={Gross, David and Liu, Yi-Kai and Flammia, Steven T and Becker, Stephen and Eisert, Jens},
journal={Physical review letters},
volume={105},
number={15},
pages={150401},
year={2010},
publisher={APS}
}
@article{gross2011recovering,
title={Recovering low-rank matrices from few coefficients in any basis},
author={Gross, David},
journal={IEEE Transactions on Information Theory},
volume={57},
number={3},
pages={1548--1566},
year={2011},
publisher={IEEE}
}
@article{koltchinskii2011nuclear,
title={Nuclear-norm penalization and optimal rates for noisy low-rank matrix completion},
author={Koltchinskii, Vladimir and Lounici, Karim and Tsybakov, Alexandre B},
journal={The Annals of Statistics},
pages={2302--2329},
year={2011},
publisher={JSTOR}
}
@article{bhojanapalli2016global,
title={Global Optimality of Local Search for Low Rank Matrix Recovery},
author={Bhojanapalli, Srinadh and Neyshabur, Behnam and Srebro, Nathan},
journal={arXiv preprint arXiv:1605.07221},
year={2016}
}
@article{koren2009matrix,
title={Matrix factorization techniques for recommender systems},
author={Koren, Yehuda and Bell, Robert and Volinsky, Chris and others},
journal={Computer},
volume={42},
number={8},
pages={30--37},
year={2009},
publisher={Institute of Electrical and Electronics Engineers, Inc., 3 Park Avenue, 17 th Fl New York NY 10016-5997 United States}
}
@article{candes2015phase,
title={Phase retrieval via matrix completion},
author={Candes, Emmanuel J and Eldar, Yonina C and Strohmer, Thomas and Voroninski, Vladislav},
journal={SIAM review},
volume={57},
number={2},
pages={225--251},
year={2015},
publisher={SIAM}
}
@inproceedings{ji2010robust,
title={Robust video denoising using low rank matrix completion.},
author={Ji, Hui and Liu, Chaoqiang and Shen, Zuowei and Xu, Yuhong},
booktitle={CVPR},
pages={1791--1798},
year={2010},
organization={Citeseer}
}
@inproceedings{wu2010robust,
title={Robust photometric stereo via low-rank matrix completion and recovery},
author={Wu, Lun and Ganesh, Arvind and Shi, Boxin and Matsushita, Yasuyuki and Wang, Yongtian and Ma, Yi},
booktitle={Asian Conference on Computer Vision},
pages={703--717},
year={2010},
organization={Springer}
}
@inproceedings{goldberg2010transduction,
title={Transduction with matrix completion: Three birds with one stone},
author={Goldberg, Andrew and Recht, Ben and Xu, Junming and Nowak, Robert and Zhu, Xiaojin},
booktitle={Advances in neural information processing systems},
pages={757--765},
year={2010}
}
@inproceedings{xie2014learning,
title={Learning from the past: intelligent on-line weather monitoring based on matrix completion},
author={Xie, Kun and Wang, Lele and Wang, Xin and Wen, Jigang and Xie, Gaogang},
booktitle={Distributed Computing Systems (ICDCS), 2014 IEEE 34th International Conference on},
pages={176--185},
year={2014},
organization={IEEE}
}
@inproceedings{cabral2013unifying,
title={Unifying nuclear norm and bilinear factorization approaches for low-rank matrix decomposition},
author={Cabral, Ricardo and De La Torre, Fernando and Costeira, Jo{\~a}o P and Bernardino, Alexandre},
booktitle={Proceedings of the IEEE International Conference on Computer Vision},
pages={2488--2495},
year={2013}
}
@inproceedings{cabral2011matrix,
title={Matrix Completion for Multi-label Image Classification.},
author={Cabral, Ricardo Silveira and De la Torre, Fernando and Costeira, Jo{\~a}o Paulo and Bernardino, Alexandre},
booktitle={NIPS},
volume={201},
number={1},
pages={2},
year={2011}
}
@inproceedings{zhou2012multi,
title={Multi-task learning: Theory, algorithms, and applications},
author={Zhou, Jiayu and Chen, Jianhui and Ye, Jieping},
booktitle={U RL https://www. siam. org/meetings/sdm12/zhou\_chen\_ye. pdf},
year={2012}
}
@article{toh1999sdpt3,
title={SDPT3—a MATLAB software package for semidefinite programming, version 1.3},
author={Toh, Kim-Chuan and Todd, Michael J and T{\"u}t{\"u}nc{\"u}, Reha H},
journal={Optimization methods and software},
volume={11},
number={1-4},
pages={545--581},
year={1999},
publisher={Taylor \& Francis}
}
@article{sturm1999using,
title={Using SeDuMi 1.02, a MATLAB toolbox for optimization over symmetric cones},
author={Sturm, Jos F},
journal={Optimization methods and software},
volume={11},
number={1-4},
pages={625--653},
year={1999},
publisher={Taylor \& Francis}
}
@article{cai2010singular,
title={A singular value thresholding algorithm for matrix completion},
author={Cai, Jian-Feng and Cand{\`e}s, Emmanuel J and Shen, Zuowei},
journal={SIAM Journal on Optimization},
volume={20},
number={4},
pages={1956--1982},
year={2010},
publisher={SIAM}
}
@article{ma2011fixed,
title={Fixed point and Bregman iterative methods for matrix rank minimization},
author={Ma, Shiqian and Goldfarb, Donald and Chen, Lifeng},
journal={Mathematical Programming},
volume={128},
number={1-2},
pages={321--353},
year={2011},
publisher={Springer}
}
@inproceedings{hazan2008sparse,
title={Sparse approximate solutions to semidefinite programs},
author={Hazan, Elad},
booktitle={Latin American Symposium on Theoretical Informatics},
pages={306--316},
year={2008},
organization={Springer}
}
@inproceedings{jaggi2010simple,
title={A simple algorithm for nuclear norm regularized problems},
author={Jaggi, Martin and Sulovsk, Marek and others},
booktitle={Proceedings of the 27th International Conference on Machine Learning (ICML-10)},
pages={471--478},
year={2010}
}
@article{bellet2014distributed,
title={Distributed Frank-Wolfe algorithm: A unified framework for communication-efficient sparse learning},
author={Bellet, Aur{\'e}lien and Liang, Yingyu and Garakani, Alireza Bagheri and Balcan, Maria-Florina and Sha, Fei},
journal={CoRR, abs/1404.2644},
year={2014},
publisher={Citeseer}
}
@inproceedings{wang2016parallel,
title={Parallel and distributed block-coordinate Frank-Wolfe algorithms},
author={Wang, Yu-Xiang and Sadhanala, Veeranjaneyulu and Dai, Wei and Neiswanger, Willie and Sra, Suvrit and Xing, Eric},
booktitle={International Conference on Machine Learning},
pages={1548--1557},
year={2016}
}
@article{lacoste2012block,
title={Block-coordinate Frank-Wolfe optimization for structural SVMs},
author={Lacoste-Julien, Simon and Jaggi, Martin and Schmidt, Mark and Pletscher, Patrick},
journal={arXiv preprint arXiv:1207.4747},
year={2012}
}
@article{frank1956algorithm,
title={An algorithm for quadratic programming},
author={Frank, Marguerite and Wolfe, Philip},
journal={Naval research logistics quarterly},
volume={3},
number={1-2},
pages={95--110},
year={1956},
publisher={Wiley Online Library}
}
@article{clarkson2010coresets,
title={Coresets, sparse greedy approximation, and the Frank-Wolfe algorithm},
author={Clarkson, Kenneth L},
journal={ACM Transactions on Algorithms (TALG)},
volume={6},
number={4},
pages={63},
year={2010},
publisher={ACM}
}
@inproceedings{jaggi2013revisiting,
title={Revisiting Frank-Wolfe: Projection-Free Sparse Convex Optimization.},
author={Jaggi, Martin},
booktitle={ICML (1)},
pages={427--435},
year={2013}
}
@article{pong2010trace,
title={Trace norm regularization: Reformulations, algorithms, and multi-task learning},
author={Pong, Ting Kei and Tseng, Paul and Ji, Shuiwang and Ye, Jieping},
journal={SIAM Journal on Optimization},
volume={20},
number={6},
pages={3465--3489},
year={2010},
publisher={SIAM}
}
@inproceedings{harchaoui2012large,
title={Large-scale image classification with trace-norm regularization},
author={Harchaoui, Zaid and Douze, Matthijs and Paulin, Mattis and Dudik, Miroslav and Malick, J{\'e}r{\^o}me},
booktitle={Computer Vision and Pattern Recognition (CVPR), 2012 IEEE Conference on},
pages={3386--3393},
year={2012},
organization={IEEE}
}
@article{ILSVRC15,
Author = {Olga Russakovsky and Jia Deng and Hao Su and Jonathan Krause and Sanjeev Satheesh and Sean Ma and Zhiheng Huang and Andrej Karpathy and Aditya Khosla and Michael Bernstein and Alexander C. Berg and Li Fei-Fei},
Title = {{ImageNet Large Scale Visual Recognition Challenge}},
Year = {2015},
journal = {International Journal of Computer Vision (IJCV)},
doi = {10.1007/s11263-015-0816-y},
volume={115},
number={3},
pages={211-252}
}
@inproceedings{he2016deep,
title={Deep residual learning for image recognition},
author={He, Kaiming and Zhang, Xiangyu and Ren, Shaoqing and Sun, Jian},
booktitle={Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition},
pages={770--778},
year={2016}
}
@misc{chollet2015keras,
title={Keras},
author={Chollet, Fran\c{c}ois},
year={2015},
publisher={GitHub},
howpublished={\url{https://github.com/fchollet/keras}},
}
@article{bach2008consistency,
title={Consistency of trace norm minimization},
author={Bach, Francis R},
journal={Journal of Machine Learning Research},
volume={9},
number={Jun},
pages={1019--1048},
year={2008}
}
@inproceedings{Zaharia:2010:SCC:1863103.1863113,
author = {Zaharia, Matei and Chowdhury, Mosharaf and Franklin, Michael J. and Shenker, Scott and Stoica, Ion},
title = {Spark: Cluster Computing with Working Sets},
booktitle = {Proceedings of the 2Nd USENIX Conference on Hot Topics in Cloud Computing},
series = {HotCloud'10},
year = {2010},
location = {Boston, MA},
pages = {10--10},
numpages = {1},
url = {http://dl.acm.org/citation.cfm?id=1863103.1863113},
acmid = {1863113},
publisher = {USENIX Association},
address = {Berkeley, CA, USA},
}
@misc{reduce,
publisher={stackoverflow},
howpublished={\url{http://stackoverflow.com/questions/37422222/how-to-force-spark-to-perform-reduction-locally}},
}
@misc{ht,
publisher={hortonworks},
howpublished={\url{https://community.hortonworks.com/questions/52561/spark-and-hyper-threading.html}},
}
@article{wai2017decentralized,
title={Decentralized Frank-Wolfe Algorithm for Convex and Non-convex Problems},
author={Wai, Hoi-To and Lafond, Jean and Scaglione, Anna and Moulines, Eric},
journal={IEEE Transactions on Automatic Control},
year={2017},
publisher={IEEE}
}
@inproceedings{mcdonald2009efficient,
title={Efficient large-scale distributed training of conditional maximum entropy models},
author={Mcdonald, Ryan and Mohri, Mehryar and Silberman, Nathan and Walker, Dan and Mann, Gideon S},
booktitle={Advances in Neural Information Processing Systems},
pages={1231--1239},
year={2009}
}
@inproceedings{zinkevich2010parallelized,
title={Parallelized stochastic gradient descent},
author={Zinkevich, Martin and Weimer, Markus and Li, Lihong and Smola, Alex J},
booktitle={Advances in neural information processing systems},
pages={2595--2603},
year={2010}
}
@article{dean2008mapreduce,
title={MapReduce: simplified data processing on large clusters},
author={Dean, Jeffrey and Ghemawat, Sanjay},
journal={Communications of the ACM},
volume={51},
number={1},
pages={107--113},
year={2008},
publisher={ACM}
}
@article{kuczynski1992estimating,
title={Estimating the largest eigenvalue by the power and Lanczos algorithms with a random start},
author={Kuczy{\'n}ski, J and Wo{\'z}niakowski, H},
journal={SIAM journal on matrix analysis and applications},
volume={13},
number={4},
pages={1094--1122},
year={1992},
publisher={SIAM}
}
@inproceedings{lacoste2015global,
title={On the global linear convergence of Frank-Wolfe optimization variants},
author={Lacoste-Julien, Simon and Jaggi, Martin},
booktitle={Advances in Neural Information Processing Systems},
pages={496--504},
year={2015}
}
@inproceedings{garber2015faster,
title={Faster Rates for the Frank-Wolfe Method over Strongly-Convex Sets.},
author={Garber, Dan and Hazan, Elad},
booktitle={ICML},
pages={541--549},
year={2015}
}
@article{wolfe1970convergence,
title={Convergence theory in nonlinear programming},
author={Wolfe, Philip},
journal={Integer and nonlinear programming},
pages={1--36},
year={1970},
publisher={North-Holland Amsterdam}
}
@article{guelat1986some,
title={Some comments on Wolfe's ‘away step’},
author={Gu{\'e}lat, Jacques and Marcotte, Patrice},
journal={Mathematical Programming},
volume={35},
number={1},
pages={110--119},
year={1986},
publisher={Springer}
}
@article{beck2004conditional,
title={A conditional gradient method with linear rate of convergence for solving convex linear systems},
author={Beck, Amir and Teboulle, Marc},
journal={Mathematical Methods of Operations Research},
volume={59},
number={2},
pages={235--247},
year={2004},
publisher={Springer}
}
@article{pena2016neumann,
title={On the von Neumann and Frank--Wolfe Algorithms with Away Steps},
author={Pena, Javier and Rodr{\'\i}guez, Daniel and Soheili, Negar},
journal={SIAM Journal on Optimization},
volume={26},
number={1},
pages={499--512},
year={2016},
publisher={SIAM}
}
@article{damla2008linear,
title={Linear convergence of a modified Frank--Wolfe algorithm for computing minimum-volume enclosing ellipsoids},
author={Damla Ahipasaoglu, S and Sun, Peng and Todd, Michael J},
journal={Optimisation Methods and Software},
volume={23},
number={1},
pages={5--19},
year={2008},
publisher={Taylor \& Francis}
}
@article{nanculef2014novel,
title={A novel Frank--Wolfe algorithm. Analysis and applications to large-scale SVM training},
author={{\~N}anculef, Ricardo and Frandi, Emanuele and Sartori, Claudio and Allende, H{\'e}ctor},
journal={Information Sciences},
volume={285},
pages={66--99},
year={2014},
publisher={Elsevier}
}
@inproceedings{liu2017approximate,
title={Approximate Conditional Gradient Descent on Multi-Class Classification.},
author={Liu, Zhuanghua and Tsang, Ivor},
booktitle={AAAI},
pages={2301--2307},
year={2017}
}
@article{moharrerdistributing,
title={Distributing Frank-Wolfe via Map-Reduce},
author={Moharrer, Armin and Ioannidis, Stratis}
}
@inproceedings{dudik2012lifted,
title={Lifted coordinate descent for learning with trace-norm regularization},
author={Dudik, Miroslav and Harchaoui, Zaid and Malick, J{\'e}r{\^o}me},
booktitle={Artificial Intelligence and Statistics},
pages={327--336},
year={2012}
}
@article{toh2010accelerated,
title={An accelerated proximal gradient algorithm for nuclear norm regularized linear least squares problems},
author={Toh, Kim-Chuan and Yun, Sangwoon},
journal={Pacific Journal of Optimization},
volume={6},
number={615-640},
pages={15},
year={2010}
}
@incollection{lian2017d-psgd,
title = {Can Decentralized Algorithms Outperform Centralized Algorithms? A Case Study for Decentralized Parallel Stochastic Gradient Descent},
author = {Lian, Xiangru and Zhang, Ce and Zhang, Huan and Hsieh, Cho-Jui and Zhang, Wei and Liu, Ji},
booktitle = {Advances in Neural Information Processing Systems 30},
editor = {I. Guyon and U. V. Luxburg and S. Bengio and H. Wallach and R. Fergus and S. Vishwanathan and R. Garnett},
pages = {5330--5340},
year = {2017},
publisher = {Curran Associates, Inc.},
url = {http://papers.nips.cc/paper/7117-can-decentralized-algorithms-outperform-centralized-algorithms-a-case-study-for-decentralized-parallel-stochastic-gradient-descent.pdf}
}
@article{nedic2016sgp,
author={{Nedić}, Angelia and {Olshevsky}, Alex},
journal={IEEE Transactions on Automatic Control},
title={Stochastic Gradient-Push for Strongly Convex Functions on Time-Varying Directed Graphs},
year={2016},
volume={61},
number={12},
pages={3936-3947},
}
@article{assran2019stochastic,
title={Stochastic Gradient Push for Distributed Deep Learning},
author={Mahmoud Assran and Nicolas Loizou and Nicolas Ballas and Michael Rabbat},
year={2019},
journal={International Conference on Machine Learning}
}
@incollection{ketkar2017introduction,
title={Introduction to pytorch},
author={Ketkar, Nikhil},
booktitle={Deep learning with python},
pages={195--208},
year={2017},
publisher={Springer}
}
@article{boyd2006randomized,
title={{Randomized Gossip Algorithms}},
author={Boyd, Stephen and Ghosh, Arpita and Prabhakar, Balaji and Shah, Devavrat},
journal={IEEE Transactions on Information Theory},
volume={52},
number={6},
pages={2508--2530},
year={2006},
publisher={IEEE},
doi={10.1109/TIT.2006.874516}
}
@article{kempe2003gossip,
title={{Gossip-based Computation of Aggregate Information}},
author={Kempe, David and Dobra, Alin and Gehrke, Johannes},
journal={44th Annual IEEE Symposium on Foundations of Computer Science, 2003. Proceedings.},
pages={482--491},
year={2003},
organization={IEEE},
doi={10.1109/SFCS.2003.1238221}
}
@article{nedic2018network,
title={{Network Topology and Communication-Computation Tradeoffs in Decentralized Optimization}},
author={Nedi{\'c}, Angelia and Olshevsky, Alex and Rabbat, Michael G},
journal={Proceedings of the IEEE},
volume={106},
number={5},
pages={953--976},
year={2018},
publisher={IEEE}
}
@inproceedings{tang18a,
title = {{$D^2$: Decentralized Training over Decentralized Data}},
author = {Tang, Hanlin and Lian, Xiangru and Yan, Ming and Zhang, Ce and Liu, Ji},
booktitle = {Proceedings of the 35th International Conference on Machine Learning},
pages = {4848--4856},
year = {2018},
editor = {Dy, Jennifer and Krause, Andreas},
volume = {80},
series = {Proceedings of Machine Learning Research},
address = {Stockholmsmässan, Stockholm Sweden},
month = {10--15 Jul},
publisher = {PMLR},
pdf = {http://proceedings.mlr.press/v80/tang18a/tang18a.pdf},
url = {http://proceedings.mlr.press/v80/tang18a.html},
}
@misc{hsieh2019noniid,
title={The Non-IID Data Quagmire of Decentralized Machine Learning},
author={Kevin Hsieh and Amar Phanishayee and Onur Mutlu and Phillip B. Gibbons},
year={2019},
eprint={1910.00189},
archivePrefix={arXiv},
primaryClass={cs.LG}
}
@article{xiao2007distributed,
title={{Distributed Average Consensus with Least-Mean-Square Deviation}},
author={Xiao, Lin and Boyd, Stephen and Kim, Seung-Jean},
journal={Journal of parallel and distributed computing},
volume={67},
number={1},
pages={33--46},
year={2007},
publisher={Elsevier}
}
@misc{mnistWebsite,
title={{THE MNIST DATABASE of handwritten digits}},
author={LeCun, Yann and Cortes, Corinna and Burges, Christopher J.C.},
year={2020},
howpublished={\url{http://yann.lecun.com/exdb/mnist/}},
note={[online, accessed 2020-06-03]}
}
@misc{shallue2018measuring,
title={{Measuring the Effects of Data Parallelism on Neural Network Training}},
author={Christopher J. Shallue and Jaehoon Lee and Joseph Antognini and Jascha Sohl-Dickstein and Roy Frostig and George E. Dahl},
year={2018},
eprint={1811.03600},
archivePrefix={arXiv},
primaryClass={cs.LG}
}
@article{watts1998collective,
title={Collective dynamics of ‘small-world’networks},
author={Watts, Duncan J and Strogatz, Steven H},
journal={nature},
volume={393},
number={6684},
pages={440--442},
year={1998},
publisher={Nature Publishing Group}
}
@book{watts2000small,
title={Small worlds: The dynamics of networks between order and randomness},
author={Watts, Duncan J},
year={2000},
publisher={Princeton University Press Princeton}
}
% Random Model Walk !!!
@article{ormandi2013gossip,
title={Gossip learning with linear models on fully distributed data},
author={Orm{\'a}ndi, R{\'o}bert and Heged{\H{u}}s, Istv{\'a}n and Jelasity, M{\'a}rk},
journal={Concurrency and Computation: Practice and Experience},
volume={25},
number={4},
pages={556--571},
year={2013},
publisher={Wiley Online Library}
}
% Random Model Walk application to mobile computing
@phdthesis{berta2020collaborative,
title={Collaborative Mobile Gossip Learning},
author={Berta, {\'A}rp{\'a}d},
year={2020},
school={szte}
}
% Scalable SGD (fully connected topology but not complete averaging every step and asynchronous local updates)
@misc{nadiradze2020swarmsgd,
title={SwarmSGD: Scalable Decentralized SGD with Local Updates},
author={Giorgi Nadiradze and Amirmojtaba Sabour and Dan Alistarh and Aditya Sharma and Ilia Markov and Vitaly Aksenov},
year={2020},
eprint={1910.12308},
archivePrefix={arXiv},
primaryClass={cs.LG}
}
% Theoretical analysis of fully decentralized sgd
% Cite this instead: https://proceedings.icml.cc/paper/2020/file/6c2e49911b68d315555d5b3eb0dd45bf-Paper.pdf
@article{koloskova2020unified,
title={A unified theory of decentralized sgd with changing topology and local updates},
author={Koloskova, Anastasia and Loizou, Nicolas and Boreiri, Sadra and Jaggi, Martin and Stich, Sebastian U},
journal={arXiv preprint arXiv:2003.10422},
year={2020}
}
@misc{gaur2020training,
title={{Training Deep Neural Networks Without Batch Normalization}},
author={Divya Gaur and Joachim Folz and Andreas Dengel},
year={2020},
eprint={2008.07970},
archivePrefix={arXiv},
primaryClass={cs.LG}
}
@misc{you2017large,
title={Large Batch Training of Convolutional Networks},
author={Yang You and Igor Gitman and Boris Ginsburg},
year={2017},
eprint={1708.03888},
archivePrefix={arXiv},
primaryClass={cs.CV}
}
@misc{wu2018group,
title={Group Normalization},
author={Yuxin Wu and Kaiming He},
year={2018},
eprint={1803.08494},
archivePrefix={arXiv},
primaryClass={cs.CV}
}
\ No newline at end of file
main.tex 0 → 100644
% This is samplepaper.tex, a sample chapter demonstrating the
% LLNCS macro package for Springer Computer Science proceedings;
% Version 2.20 of 2017/10/04
%
\documentclass[runningheads]{llncs}
%
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
%\usepackage{amsthm}
\usepackage{graphicx}
\usepackage{xcolor}
\usepackage{soul}
\usepackage{hyperref}
\usepackage{algorithm}
\usepackage{algpseudocode}
\usepackage{dsfont}
\usepackage{caption}
\usepackage{subcaption}
% Used for displaying a sample figure. If possible, figure files should
% be included in EPS format.
%
% If you use the hyperref package, please uncomment the following line
% to display URLs in blue roman font according to Springer's eBook style:
% \renewcommand\UrlFont{\color{blue}\rmfamily}
\begin{document}
%
\title{D-Cliques: An Efficient Topology to Compensate for Non-IID Data in Decentralized Learning}
%
\titlerunning{D-Cliques}
% If the paper title is too long for the running head, you can set
% an abbreviated paper title here
%
\author{Aur\'elien Bellet\inst{1}\thanks{Authors in alphabetical order of last names, see Section 'Credits' for respective contributions.} \and
Anne-Marie Kermarrec\inst{2} \and
Erick Lavoie\inst{2}}
%
\authorrunning{A. Bellet, A-M. Kermarrec, E. Lavoie}
% First names are abbreviated in the running head.
% If there are more than two authors, 'et al.' is used.
%
\institute{Inria, Lille, France\\
\email{aurelien.bellet@inria.fr} \and
EPFL, Lausanne, Switzerland \\
\email{\{anne-marie.kermarrec,erick.lavoie\}@epfl.ch}\\
}
%
\maketitle % typeset the header of the contribution
%
\begin{abstract}
The abstract should briefly summarize the contents of the paper in
150--250 words.
\keywords{Decentralized Learning \and Federated Learning \and Topology \and Stochastic Gradient Descent}
\end{abstract}
%
%
%
\section{Introduction}
TODO: Short verbal introduction to D-PSGD
\begin{figure}
\centering
\begin{subfigure}[b]{0.3\textwidth}
\centering
\includegraphics[width=\textwidth]{figures/ring-IID-vs-non-IID}
\caption{\label{fig:ring-IID-vs-non-IID} Ring: (almost) minimal connectivity.}
\end{subfigure}
\hfill
\begin{subfigure}[b]{0.25\textwidth}
\centering
\includegraphics[width=\textwidth]{figures/grid-IID-vs-non-IID}
\caption{\label{fig:grid-IID-vs-non-IID} Grid: intermediate connectivity.}
\end{subfigure}
\hfill
\begin{subfigure}[b]{0.3\textwidth}
\centering
\includegraphics[width=\textwidth]{figures/fully-connected-IID-vs-non-IID}
\caption{\label{fig:fully-connected-IID-vs-non-IID} Fully-connected: maximal connectivity.}
\end{subfigure}
\caption{IID vs non-IID Convergence Speed. Thin lines are the minimum and maximum accuracy of individual nodes. Bold lines are the average accuracy across all nodes.\protect \footnotemark}
\label{fig:iid-vs-non-iid-problem}
\end{figure}
\footnotetext{This is different from the accuracy of the average model across nodes that is sometimes used once training is completed.}
\textit{Are there regular topologies, i.e. where all nodes have similar or the same number of neighbours, with less connections than a fully-connected graph that retain a similar convergence speed and non-IID behaviour?}
\subsection{Bias in Gradient Averaging with Non-IID Data}
To have a preliminary intuition of the impact of non-IID data on convergence speed, examine the local neighbourhood of a single node in a grid similar to that used to obtain results in Figure~\ref{fig:grid-IID-vs-non-IID}, as illustrated in Figure~\ref{fig:grid-iid-vs-non-iid-neighbourhood}. The color of a node, represented as a circle, corresponds to one of the 10 available classes in the dataset. In this IID setting (Figure~\ref{fig:grid-iid-neighbourhood}), each node has examples of all ten classes in equal proportions. In this (rather extreme) non-IID case (Figure~\ref{fig:grid-non-iid-neighbourhood}), each node has examples of only a single class and nodes are distributed randomly in the grid, with neighbourhood such as this one, sometimes having nodes with examples of the same class adjacent to each other.
\begin{figure}
\centering
\begin{subfigure}[b]{0.33\textwidth}
\centering
\includegraphics[width=\textwidth]{figures/grid-iid-neighbourhood}
\caption{\label{fig:grid-iid-neighbourhood} IID}
\end{subfigure}
\begin{subfigure}[b]{0.33\textwidth}
\centering
\includegraphics[width=\textwidth]{figures/grid-non-iid-neighbourhood}
\caption{\label{fig:grid-non-iid-neighbourhood} Non-IID}
\end{subfigure}
\caption{Neighbourhood in an IID and non-IID Grid.}
\label{fig:grid-iid-vs-non-iid-neighbourhood}
\end{figure}
For the sake of the argument, assume all nodes are initialized with the same model weights, which is not critical for quick convergence in an IID setting but makes the comparison easier. A single training step, from the point of view of the middle node of the illustrated neighbourhood, is equivalent to sampling a mini-batch five times larger from the union of the local distributions of the five illustrated nodes.
In the IID case, since gradients are computed from examples of all classes, the resulting average gradient will point in a direction that lowers the loss for all classes. This is the case because the components of the gradient that would only improve the loss on a subset of the classes to the detriment of others are cancelled by similar but opposite components from other classes. Therefore only the components that improve the loss for all classes remain. There is some variance remaining from the difference between examples but in practice it has a sufficiently small impact on convergence speed that there are still benefits from parallelizing the computations.
However, in the (rather extreme) non-IID case illustrated, there are not enough nodes in the neighbourhood to remove the bias of the classes represented. Even if all nodes start from the same model weights, they will diverge from one another according to the classes represented in their neighbourhood, more than they would have had in the IID case. As the distributed averaging algorithm takes several steps to converge, this variance is never fully resolved and the variance remains between steps.\footnote{It is possible, but impractical, to compensate for this effect by averaging multiple times before the next gradient computation. In effect, this trades connectivity (number of edges) for latency to give the same convergence speed, in number of gradients computed, as a fully connected graph.} This additional variance biases subsequent gradient computations as the gradients are computed further away from the global average, in addition to being computed from different examples. As shown in Figure~\ref{fig:ring-IID-vs-non-IID} and \ref{fig:grid-IID-vs-non-IID}, this significantly slows down convergence speed to the point of making parallel optimization impractical.
\subsection{D-Cliques}
\begin{figure}[htbp]
\centering
\includegraphics[width=0.4\textwidth]{figures/fully-connected-cliques}
\caption{\label{fig:d-cliques-example} D-Cliques: Connected Cliques of Dissimilar Nodes, Locally Representative of the Global Distribution}
\end{figure}
If we relax the constraint of regularity, a trivial solution is a star topology, as used in most Federated Learning implementations (CITE) at the expense of a high requirement on reliability and available bandwidth on the central node. We instead propose a regular topology, built around \textit{cliques} of dissimilar nodes, locally representative of the global distribution and connected by few links, as illustrated in Figure~\ref{fig:d-cliques-example}. D-Cliques enable similar convergence speed as a fully connected topology, using a number of edges that grows sub-exponentially ($O(nc + \frac{n^2}{c^2})$ where $n$ is the number of nodes and $c$ is the size of a clique\footnote{$O((\frac{n}{c})c^2 + (\frac{n}{c})^2)$, i.e. number of cliques times the number of edges within cliques (squared in the size of cliques) in addition to inter-cliques edges (square of the number of cliques).}.), instead of exponentially in the number of nodes ($O(n^2)$), with a corresponding reduction in bandwidth usage and required number of messages per round of training. In practice, for the cases with networks of size 100 we have tested, that corresponds to a reduction in the number of edges of 90\%. (TODO: Do analysis if the pattern is fractal with three levels at 1000 nodes: cliques, 10 cliques connected pairwise in a "region", and each "region" connected pairwise with other regions)
Because the data distribution within each clique is representative of the global distribution, we can recover optimization techniques that rely on an IID assumption, in a distributed setting that is not. As one example, we show how momentum (CITE) can be used with D-Cliques to greatly improve convergence speed of convolutional networks, as in a centralized IID setting, even though the technique is otherwise \textit{detrimental} in a more general non-IID setting.
As a summary, we make the following contributions:
\begin{itemize}
\item we propose the D-Cliques topology to remove the impact of non-IID data on convergence speed, similar to a fully-connected topology, with a reduced number of edges and required messages
\item we show how to leverage D-Cliques to implement momentum in a distributed non-IID setting, which would otherwise be detrimental to the convergence speed of convolutional networks
\end{itemize}
The rest of the paper is organized as such. \dots
\section{Related Work}
D2: numerically unstable when $W_{ij}$ rows and columns do not exactly sum to $1$, as the small differences are amplified in a positive feedback loop. More work is therefore required on the algorithm to make it usable with a wider variety of topologies. In comparison, D-cliques do not modify the SGD algorithm and instead simply removes some neighbour contributions that would otherwise bias the direction of the gradient. D-Cliques with D-PSGD are therefore as tolerant to ill-conditioned $W_{ij}$ matrices as regular D-PSGD in an IID setting.
\section{Problem Statement}
\label{section:problem}
A set of $n$ nodes $N = \{1, \dots, n \}$ communicates with their neighbours defined by the mixing matrix $W$ in which $W_{ij}$ defines the \textit{weight} of the outgoing connection from node $i$ to $j$. $W_{ij} = 0$ means that there is no connection from node $i$ to $j$ and $W_{ij} > 0$ means there is a connection.
Training data is sampled from a global distribution $D$ unknown to the nodes. Each node has access to an arbitrary partition of the samples that follows its own local distribution $D_i$. Nodes cooperate to reach consensus on a global model $M$ that performs well on $D$ by minimizing the average training loss on local models:
\begin{equation}
min_{x_i, i = 1, \dots, n} = \frac{1}{n}\sum_{i=1}^{n} \mathds{E}_{s_i \sim D_i} F_i(x_i;s_i)
\label{eq:dist-optimization-problem}
\end{equation}
such that $M= x_i = x_j, \forall i,j \in N$, where $x_i$ are the parameters of
node $i$'s local model, $s_i$ is a sample of $D_i$, $F_i$ is the loss function
on node $i$, and $\mathds{E}_{s_i \sim D_i} F_i(x_i;s_i)$ denotes the
expected value of $F_i$ on a random sample $s_i$ drawn from $D_i$.
\subsection{Non-IID Data}
Removing the assumption of \textit{independent and identically distributed} (IID) data opens a wide range of potential practical difficulties. While non-IID simply means that a local dataset is a biased sample of the global distribution $D$, the difficulty of the learning problem depends on additional factors that compound with that bias. For example, an imbalance in the number of examples for each class represented in the global distribution compounds with the position of the nodes that have the examples of the rarest class. Additionally, if two local datasets have different number of examples, the examples in the smaller dataset will be visited more often than those in a larger dataset, potentially skewing the optimisation process to perform better on the examples seen more often.
To focus our study while still retaining the core aspects of the problem, we make the following assumptions: (1) all classes are equally represented in the global dataset, by randomly removing examples from the larger classes if necessary; (2) all classes are represented on the same number of nodes; (3) all nodes have the same number of examples. Within those assumptions, we take the hardest possible problem, which is to have each node having examples of only a single class. For the following experiments, we use the MNIST (CITE) and CIFAR10 (CITE) datasets.
\subsection{Learning Algorithm}
We use the Decentralized-Parallel Stochastic Gradient Descent, aka D-PSGD~\cite{lian2017d-psgd}, illustrated in Algorithm~\ref{Algorithm:D-PSGD}. A single step consists of sampling the local distribution $D_i$, computing and applying a stochastic gradient descent (SGD) step with regard to that sample, and averaging the model with its neighbours. Both outgoing and incoming weights of $W$ must sum to 1, i.e. $W$ is doubly stochastic ($\sum_{j \in N} W_{ij} = 1$ and $\sum_{j \in N} W_{ji} = 1$), and communication is symmetric, i.e. $W_{ij} = W_{ji}$.
\begin{algorithm}[h]
\caption{D-PSGD, Node $i$}
\label{Algorithm:D-PSGD}
\begin{algorithmic}[1]
\State \textbf{Require} initial model parameters $x_i^{(0)}$, learning rate $\gamma$, mixing weights $W$, number of steps $K$, loss function $F$
\For{$k = 1,\ldots, K$}
\State $s_i^{(k)} \gets \textit{sample from~} D_i$
\State $x_i^{(k-\frac{1}{2})} \gets x_i^{(k-1)} - \gamma \nabla F(x_i^{(k-1)}; s_i^{(k)})$
\State $x_i^{(k)} \gets \sum_{j \in N} W_{ji}^{(k)} x_j^{(k-\frac{1}{2})}$
\EndFor
\end{algorithmic}
\end{algorithm}
D-PSGD can be used with a variety of models, including deep learning networks. To remove the impact of particular architectural choices on our results, we use a linear classifier (CITE). This model provides up to 92.5\% accuracy when fully converged on MNIST (CITE), about 7\% less than state-of-the-art deep learning networks (CITE).
%\subsection{Clustering}
%
%From the perspective of one node, \textit{clustering} intuitively represents how many connections exist between its immediate neighbours. A high level of clustering means that neighbours have many edges between each other. The highest level is a \textit{clique}, where all nodes in the neighbourhood are connected to one another. Formally, the level of clustering, between $0$ and $1$, is the ratio of $\frac{\textit{nb edges between neighbours}}{\textit{nb possible edges}}$~\cite{watts2000small}.
%
\section{D-Cliques}
Three Main ideas:
\begin{itemize}
\item Create cliques such that the clique distribution is representative of the global distribution
\item Connect cliques, based on level of "redundancy" in the datasets
\item Decouple gradient averaging from weight averaging
\end{itemize}
\subsection{Creating Representative Cliques}
The degree of \textit{skew} of local distributions $D_i$, i.e. how much the local distribution deviates from the global distribution on each node, influences the minimal size of cliques.
The global distribution of classes, for classification tasks, can be computed from the distribution of class examples on the nodes, with Distributed Averaging (CITE). Given the global distribution of classes, neighbours within cliques can be chosen based on a PeerSampling (CITE) service. Both services can be implemented such that they converge in a logarithmic number of steps compared to the number of nodes. It is therefore possible to obtain this information in a scalable way.
In the rest of this paper, we assume these services are available and show that the approach provides a useful convergence speed after the cliques have been formed.
\subsection{Connecting Cliques}
The \textit{"redundancy"} of the data, i.e. how much each additional example in the training set contributes to the final accuracy, influences the minimum number of connections required between cliques to reach a given convergence speed. It needs to be evaluated empirically on a learning task. In effect, redundancy is the best parallelization factor as the more redundant the dataset is, the less nodes need to communicate. For the following arguments, $n$ is the number of nodes and $c$ is the size of a clique.
For highly redundant datasets, it may be sufficient to arrange cliques in a ring. This is not specific to D-Cliques, it is also the case with IID nodes but it is nonetheless useful to be kept in mind for D-Cliques also. In this case, the number of edges will be $O(nc + \frac{n}{c})$ and therefore linear in the number of nodes $n$.
For cases with limited redundancy, nodes can be arranged such that they are at most 2 hops away from any other nodes in the network to quickly propagate updates in the network. In effect, this is equivalent to fully connecting cliques (instead of nodes). In this case, the number of edges will be $O(nc + \frac{n^2}{c^2})$ and therefore still exponential in the number of nodes but with a strong reduction in the number of edges when $c$ is large compared to $n$ (ex: $c \geq \frac{n}{100}$).
In between, there might be enough redundancy in the dataset to arrange cliques in a fractal/hierarchical pattern such that the maximum number of hops between nodes grows logarithmically with $n$. TODO: Complexity argument.
\subsection{Decoupling Gradient Averaging from Weight Averaging}
Inter-clique connections create sources of bias in regular D-PSGD with Metropolis-Hasting (CITE):
\begin{itemize}
\item Non-uniform weights in neighbourhood for nodes not connected to other cliques
\item Non-uniform class representations in nodes connected to other cliques
\end{itemize}
TODO: Figure illustrating problem
We solve this problem by decoupling the gradient averaging from the weight averaging by sending each in separate rounds of messages.
TODO: New (minor) algorithm version of D-PSGD
\section{Applications}
\subsection{MNIST and Linear Model}
\begin{figure}[htbp]
\centering
\includegraphics[width=0.7\textwidth]{figures/10-cliques-validation-accuracy}
\caption{\label{fig:d-cliques-mnist-linear} D-Cliques with Linear Model on MNIST.}
\end{figure}
TODO: Update figure to use decoupled gradient averaging (will probably reduce variance and accelerate convergence speed)
\subsection{CIFAR10 and Convolutional Model}
\begin{figure}[htbp]
\centering
\begin{subfigure}[b]{0.48\textwidth}
\centering
\includegraphics[width=\textwidth]{figures/d-cliques-cifar10-vs-1-node-training-loss}
\caption{\label{fig:d-cliques-cifar10-training-loss} Training Loss}
\end{subfigure}
\begin{subfigure}[b]{0.48\textwidth}
\centering
\includegraphics[width=\textwidth]{figures/d-cliques-cifar10-vs-1-node-validation-accuracy}
\caption{\label{fig:d-cliques-cifar10-validation-accuracy} Validation Accuracy}
\end{subfigure}
\caption{\label{fig:d-cliques-cifar10-convolutional} D-Cliques with Convolutional Network on CIFAR10.}
\end{figure}
\section{Evaluation}
\subsection{Effect of Scaling}
\subsection{Comparison to similar topologies}
\begin{itemize}
\item Uniform Diverse Neighbourhood with No Clustering
\item Random network
\item Random Small-World Graph
\end{itemize}
\subsection{Relaxing Clique Connectivity}
\section{Conclusion}
\section{Credits}
%
% ---- Bibliography ----
%
% BibTeX users should specify bibliography style 'splncs04'.
% References will then be sorted and formatted in the correct style.
%
\bibliographystyle{splncs04}
\bibliography{main}
\end{document}
%% BibTeX bibliography style `splncs03'
%%
%% BibTeX bibliography style for use with numbered references in
%% Springer Verlag's "Lecture Notes in Computer Science" series.
%% (See Springer's documentation for llncs.cls for
%% more details of the suggested reference format.) Note that this
%% file will not work for author-year style citations.
%%
%% Use \documentclass{llncs} and \bibliographystyle{splncs03}, and cite
%% a reference with (e.g.) \cite{smith77} to get a "[1]" in the text.
%%
%% This file comes to you courtesy of Maurizio "Titto" Patrignani of
%% Dipartimento di Informatica e Automazione Universita' Roma Tre
%%
%% ================================================================================================
%% This was file `titto-lncs-02.bst' produced on Wed Apr 1, 2009
%% Edited by hand by titto based on `titto-lncs-01.bst' (see below)
%%
%% CHANGES (with respect to titto-lncs-01.bst):
%% - Removed the call to \urlprefix (thus no "URL" string is added to the output)
%% ================================================================================================
%% This was file `titto-lncs-01.bst' produced on Fri Aug 22, 2008
%% Edited by hand by titto based on `titto.bst' (see below)
%%
%% CHANGES (with respect to titto.bst):
%% - Removed the "capitalize" command for editors string "(eds.)" and "(ed.)"
%% - Introduced the functions titto.bbl.pages and titto.bbl.page for journal pages (without "pp.")
%% - Added a new.sentence command to separate with a dot booktitle and series in the inproceedings
%% - Commented all new.block commands before urls and notes (to separate them with a comma)
%% - Introduced the functions titto.bbl.volume for handling journal volumes (without "vol." label)
%% - Used for editors the same name conventions used for authors (see function format.in.ed.booktitle)
%% - Removed a \newblock to avoid long spaces between title and "In: ..."
%% - Added function titto.space.prefix to add a space instead of "~" after the (removed) "vol." label
%% - Added doi
%% ================================================================================================
%% This was file `titto.bst',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% merlin.mbs (with options: `vonx,nm-rvvc,yr-par,jttl-rm,volp-com,jwdpg,jwdvol,numser,ser-vol,jnm-x,btit-rm,bt-rm,edparxc,bkedcap,au-col,in-col,fin-bare,pp,ed,abr,mth-bare,xedn,jabr,and-com,and-com-ed,xand,url,url-blk,em-x,nfss,')
%% ----------------------------------------
%% *** Tentative .bst file for Springer LNCS ***
%%
%% Copyright 1994-2007 Patrick W Daly
% ===============================================================
% IMPORTANT NOTICE:
% This bibliographic style (bst) file has been generated from one or
% more master bibliographic style (mbs) files, listed above.
%
% This generated file can be redistributed and/or modified under the terms
% of the LaTeX Project Public License Distributed from CTAN
% archives in directory macros/latex/base/lppl.txt; either
% version 1 of the License, or any later version.
% ===============================================================
% Name and version information of the main mbs file:
% \ProvidesFile{merlin.mbs}[2007/04/24 4.20 (PWD, AO, DPC)]
% For use with BibTeX version 0.99a or later
%-------------------------------------------------------------------
% This bibliography style file is intended for texts in ENGLISH
% This is a numerical citation style, and as such is standard LaTeX.
% It requires no extra package to interface to the main text.
% The form of the \bibitem entries is
% \bibitem{key}...
% Usage of \cite is as follows:
% \cite{key} ==>> [#]
% \cite[chap. 2]{key} ==>> [#, chap. 2]
% where # is a number determined by the ordering in the reference list.
% The order in the reference list is alphabetical by authors.
%---------------------------------------------------------------------
ENTRY
{ address
author
booktitle
chapter
doi
edition
editor
eid
howpublished
institution
journal
key
month
note
number
organization
pages
publisher
school
series
title
type
url
volume
year
}
{}
{ label }
INTEGERS { output.state before.all mid.sentence after.sentence after.block }
FUNCTION {init.state.consts}
{ #0 'before.all :=
#1 'mid.sentence :=
#2 'after.sentence :=
#3 'after.block :=
}
STRINGS { s t}
FUNCTION {output.nonnull}
{ 's :=
output.state mid.sentence =
{ ", " * write$ }
{ output.state after.block =
{ add.period$ write$
% newline$
% "\newblock " write$ % removed for titto-lncs-01
" " write$ % to avoid long spaces between title and "In: ..."
}
{ output.state before.all =
'write$
{ add.period$ " " * write$ }
if$
}
if$
mid.sentence 'output.state :=
}
if$
s
}
FUNCTION {output}
{ duplicate$ empty$
'pop$
'output.nonnull
if$
}
FUNCTION {output.check}
{ 't :=
duplicate$ empty$
{ pop$ "empty " t * " in " * cite$ * warning$ }
'output.nonnull
if$
}
FUNCTION {fin.entry}
{ duplicate$ empty$
'pop$
'write$
if$
newline$
}
FUNCTION {new.block}
{ output.state before.all =
'skip$
{ after.block 'output.state := }
if$
}
FUNCTION {new.sentence}
{ output.state after.block =
'skip$
{ output.state before.all =
'skip$
{ after.sentence 'output.state := }
if$
}
if$
}
FUNCTION {add.blank}
{ " " * before.all 'output.state :=
}
FUNCTION {add.colon}
{ duplicate$ empty$
'skip$
{ ":" * add.blank }
if$
}
FUNCTION {date.block}
{
new.block
}
FUNCTION {not}
{ { #0 }
{ #1 }
if$
}
FUNCTION {and}
{ 'skip$
{ pop$ #0 }
if$
}
FUNCTION {or}
{ { pop$ #1 }
'skip$
if$
}
STRINGS {z}
FUNCTION {remove.dots}
{ 'z :=
""
{ z empty$ not }
{ z #1 #1 substring$
z #2 global.max$ substring$ 'z :=
duplicate$ "." = 'pop$
{ * }
if$
}
while$
}
FUNCTION {new.block.checka}
{ empty$
'skip$
'new.block
if$
}
FUNCTION {new.block.checkb}
{ empty$
swap$ empty$
and
'skip$
'new.block
if$
}
FUNCTION {new.sentence.checka}
{ empty$
'skip$
'new.sentence
if$
}
FUNCTION {new.sentence.checkb}
{ empty$
swap$ empty$
and
'skip$
'new.sentence
if$
}
FUNCTION {field.or.null}
{ duplicate$ empty$
{ pop$ "" }
'skip$
if$
}
FUNCTION {emphasize}
{ skip$ }
FUNCTION {embolden}
{ duplicate$ empty$
{ pop$ "" }
{ "\textbf{" swap$ * "}" * }
if$
}
FUNCTION {tie.or.space.prefix}
{ duplicate$ text.length$ #5 <
{ "~" }
{ " " }
if$
swap$
}
FUNCTION {titto.space.prefix} % always introduce a space
{ duplicate$ text.length$ #3 <
{ " " }
{ " " }
if$
swap$
}
FUNCTION {capitalize}
{ "u" change.case$ "t" change.case$ }
FUNCTION {space.word}
{ " " swap$ * " " * }
% Here are the language-specific definitions for explicit words.
% Each function has a name bbl.xxx where xxx is the English word.
% The language selected here is ENGLISH
FUNCTION {bbl.and}
{ "and"}
FUNCTION {bbl.etal}
{ "et~al." }
FUNCTION {bbl.editors}
{ "eds." }
FUNCTION {bbl.editor}
{ "ed." }
FUNCTION {bbl.edby}
{ "edited by" }
FUNCTION {bbl.edition}
{ "edn." }
FUNCTION {bbl.volume}
{ "vol." }
FUNCTION {titto.bbl.volume} % for handling journals
{ "" }
FUNCTION {bbl.of}
{ "of" }
FUNCTION {bbl.number}
{ "no." }
FUNCTION {bbl.nr}
{ "no." }
FUNCTION {bbl.in}
{ "in" }
FUNCTION {bbl.pages}
{ "pp." }
FUNCTION {bbl.page}
{ "p." }
FUNCTION {titto.bbl.pages} % for journals
{ "" }
FUNCTION {titto.bbl.page} % for journals
{ "" }
FUNCTION {bbl.chapter}
{ "chap." }
FUNCTION {bbl.techrep}
{ "Tech. Rep." }
FUNCTION {bbl.mthesis}
{ "Master's thesis" }
FUNCTION {bbl.phdthesis}
{ "Ph.D. thesis" }
MACRO {jan} {"Jan."}
MACRO {feb} {"Feb."}
MACRO {mar} {"Mar."}
MACRO {apr} {"Apr."}
MACRO {may} {"May"}
MACRO {jun} {"Jun."}
MACRO {jul} {"Jul."}
MACRO {aug} {"Aug."}
MACRO {sep} {"Sep."}
MACRO {oct} {"Oct."}
MACRO {nov} {"Nov."}
MACRO {dec} {"Dec."}
MACRO {acmcs} {"ACM Comput. Surv."}
MACRO {acta} {"Acta Inf."}
MACRO {cacm} {"Commun. ACM"}
MACRO {ibmjrd} {"IBM J. Res. Dev."}
MACRO {ibmsj} {"IBM Syst.~J."}
MACRO {ieeese} {"IEEE Trans. Software Eng."}
MACRO {ieeetc} {"IEEE Trans. Comput."}
MACRO {ieeetcad}
{"IEEE Trans. Comput. Aid. Des."}
MACRO {ipl} {"Inf. Process. Lett."}
MACRO {jacm} {"J.~ACM"}
MACRO {jcss} {"J.~Comput. Syst. Sci."}
MACRO {scp} {"Sci. Comput. Program."}
MACRO {sicomp} {"SIAM J. Comput."}
MACRO {tocs} {"ACM Trans. Comput. Syst."}
MACRO {tods} {"ACM Trans. Database Syst."}
MACRO {tog} {"ACM Trans. Graphic."}
MACRO {toms} {"ACM Trans. Math. Software"}
MACRO {toois} {"ACM Trans. Office Inf. Syst."}
MACRO {toplas} {"ACM Trans. Progr. Lang. Syst."}
MACRO {tcs} {"Theor. Comput. Sci."}
FUNCTION {bibinfo.check}
{ swap$
duplicate$ missing$
{
pop$ pop$
""
}
{ duplicate$ empty$
{
swap$ pop$
}
{ swap$
pop$
}
if$
}
if$
}
FUNCTION {bibinfo.warn}
{ swap$
duplicate$ missing$
{
swap$ "missing " swap$ * " in " * cite$ * warning$ pop$
""
}
{ duplicate$ empty$
{
swap$ "empty " swap$ * " in " * cite$ * warning$
}
{ swap$
pop$
}
if$
}
if$
}
FUNCTION {format.url}
{ url empty$
{ "" }
% { "\urlprefix\url{" url * "}" * }
{ "\url{" url * "}" * } % changed in titto-lncs-02.bst
if$
}
FUNCTION {format.doi} % added in splncs04.bst
{ doi empty$
{ "" }
{ after.block 'output.state :=
"\doi{" doi * "}" * }
if$
}
INTEGERS { nameptr namesleft numnames }
STRINGS { bibinfo}
FUNCTION {format.names}
{ 'bibinfo :=
duplicate$ empty$ 'skip$ {
's :=
"" 't :=
#1 'nameptr :=
s num.names$ 'numnames :=
numnames 'namesleft :=
{ namesleft #0 > }
{ s nameptr
"{vv~}{ll}{, jj}{, f{.}.}"
format.name$
bibinfo bibinfo.check
't :=
nameptr #1 >
{
namesleft #1 >
{ ", " * t * }
{
s nameptr "{ll}" format.name$ duplicate$ "others" =
{ 't := }
{ pop$ }
if$
"," *
t "others" =
{
" " * bbl.etal *
}
{ " " * t * }
if$
}
if$
}
't
if$
nameptr #1 + 'nameptr :=
namesleft #1 - 'namesleft :=
}
while$
} if$
}
FUNCTION {format.names.ed}
{
'bibinfo :=
duplicate$ empty$ 'skip$ {
's :=
"" 't :=
#1 'nameptr :=
s num.names$ 'numnames :=
numnames 'namesleft :=
{ namesleft #0 > }
{ s nameptr
"{f{.}.~}{vv~}{ll}{ jj}"
format.name$
bibinfo bibinfo.check
't :=
nameptr #1 >
{
namesleft #1 >
{ ", " * t * }
{
s nameptr "{ll}" format.name$ duplicate$ "others" =
{ 't := }
{ pop$ }
if$
"," *
t "others" =
{
" " * bbl.etal *
}
{ " " * t * }
if$
}
if$
}
't
if$
nameptr #1 + 'nameptr :=
namesleft #1 - 'namesleft :=
}
while$
} if$
}
FUNCTION {format.authors}
{ author "author" format.names
}
FUNCTION {get.bbl.editor}
{ editor num.names$ #1 > 'bbl.editors 'bbl.editor if$ }
FUNCTION {format.editors}
{ editor "editor" format.names duplicate$ empty$ 'skip$
{
" " *
get.bbl.editor
% capitalize
"(" swap$ * ")" *
*
}
if$
}
FUNCTION {format.note}
{
note empty$
{ "" }
{ note #1 #1 substring$
duplicate$ "{" =
'skip$
{ output.state mid.sentence =
{ "l" }
{ "u" }
if$
change.case$
}
if$
note #2 global.max$ substring$ * "note" bibinfo.check
}
if$
}
FUNCTION {format.title}
{ title
duplicate$ empty$ 'skip$
{ "t" change.case$ }
if$
"title" bibinfo.check
}
FUNCTION {output.bibitem}
{ newline$
"\bibitem{" write$
cite$ write$
"}" write$
newline$
""
before.all 'output.state :=
}
FUNCTION {n.dashify}
{
't :=
""
{ t empty$ not }
{ t #1 #1 substring$ "-" =
{ t #1 #2 substring$ "--" = not
{ "--" *
t #2 global.max$ substring$ 't :=
}
{ { t #1 #1 substring$ "-" = }
{ "-" *
t #2 global.max$ substring$ 't :=
}
while$
}
if$
}
{ t #1 #1 substring$ *
t #2 global.max$ substring$ 't :=
}
if$
}
while$
}
FUNCTION {word.in}
{ bbl.in capitalize
":" *
" " * }
FUNCTION {format.date}
{
month "month" bibinfo.check
duplicate$ empty$
year "year" bibinfo.check duplicate$ empty$
{ swap$ 'skip$
{ "there's a month but no year in " cite$ * warning$ }
if$
*
}
{ swap$ 'skip$
{
swap$
" " * swap$
}
if$
*
remove.dots
}
if$
duplicate$ empty$
'skip$
{
before.all 'output.state :=
" (" swap$ * ")" *
}
if$
}
FUNCTION {format.btitle}
{ title "title" bibinfo.check
duplicate$ empty$ 'skip$
{
}
if$
}
FUNCTION {either.or.check}
{ empty$
'pop$
{ "can't use both " swap$ * " fields in " * cite$ * warning$ }
if$
}
FUNCTION {format.bvolume}
{ volume empty$
{ "" }
{ bbl.volume volume tie.or.space.prefix
"volume" bibinfo.check * *
series "series" bibinfo.check
duplicate$ empty$ 'pop$
{ emphasize ", " * swap$ * }
if$
"volume and number" number either.or.check
}
if$
}
FUNCTION {format.number.series}
{ volume empty$
{ number empty$
{ series field.or.null }
{ output.state mid.sentence =
{ bbl.number }
{ bbl.number capitalize }
if$
number tie.or.space.prefix "number" bibinfo.check * *
series empty$
{ "there's a number but no series in " cite$ * warning$ }
{ bbl.in space.word *
series "series" bibinfo.check *
}
if$
}
if$
}
{ "" }
if$
}
FUNCTION {format.edition}
{ edition duplicate$ empty$ 'skip$
{
output.state mid.sentence =
{ "l" }
{ "t" }
if$ change.case$
"edition" bibinfo.check
" " * bbl.edition *
}
if$
}
INTEGERS { multiresult }
FUNCTION {multi.page.check}
{ 't :=
#0 'multiresult :=
{ multiresult not
t empty$ not
and
}
{ t #1 #1 substring$
duplicate$ "-" =
swap$ duplicate$ "," =
swap$ "+" =
or or
{ #1 'multiresult := }
{ t #2 global.max$ substring$ 't := }
if$
}
while$
multiresult
}
FUNCTION {format.pages}
{ pages duplicate$ empty$ 'skip$
{ duplicate$ multi.page.check
{
bbl.pages swap$
n.dashify
}
{
bbl.page swap$
}
if$
tie.or.space.prefix
"pages" bibinfo.check
* *
}
if$
}
FUNCTION {format.journal.pages}
{ pages duplicate$ empty$ 'pop$
{ swap$ duplicate$ empty$
{ pop$ pop$ format.pages }
{
", " *
swap$
n.dashify
pages multi.page.check
'titto.bbl.pages
'titto.bbl.page
if$
swap$ tie.or.space.prefix
"pages" bibinfo.check
* *
*
}
if$
}
if$
}
FUNCTION {format.journal.eid}
{ eid "eid" bibinfo.check
duplicate$ empty$ 'pop$
{ swap$ duplicate$ empty$ 'skip$
{
", " *
}
if$
swap$ *
}
if$
}
FUNCTION {format.vol.num.pages} % this function is used only for journal entries
{ volume field.or.null embolden
duplicate$ empty$ 'skip$
{
% bbl.volume swap$ tie.or.space.prefix
titto.bbl.volume swap$ titto.space.prefix
% rationale for the change above: for journals you don't want "vol." label
% hence it does not make sense to attach the journal number to the label when
% it is short
"volume" bibinfo.check
* *
}
if$
number "number" bibinfo.check duplicate$ empty$ 'skip$
{
swap$ duplicate$ empty$
{ "there's a number but no volume in " cite$ * warning$ }
'skip$
if$
swap$
"(" swap$ * ")" *
}
if$ *
eid empty$
{ format.journal.pages }
{ format.journal.eid }
if$
}
FUNCTION {format.chapter.pages}
{ chapter empty$
'format.pages
{ type empty$
{ bbl.chapter }
{ type "l" change.case$
"type" bibinfo.check
}
if$
chapter tie.or.space.prefix
"chapter" bibinfo.check
* *
pages empty$
'skip$
{ ", " * format.pages * }
if$
}
if$
}
FUNCTION {format.booktitle}
{
booktitle "booktitle" bibinfo.check
}
FUNCTION {format.in.ed.booktitle}
{ format.booktitle duplicate$ empty$ 'skip$
{
% editor "editor" format.names.ed duplicate$ empty$ 'pop$ % changed by titto
editor "editor" format.names duplicate$ empty$ 'pop$
{
" " *
get.bbl.editor
% capitalize
"(" swap$ * ") " *
* swap$
* }
if$
word.in swap$ *
}
if$
}
FUNCTION {empty.misc.check}
{ author empty$ title empty$ howpublished empty$
month empty$ year empty$ note empty$
and and and and and
key empty$ not and
{ "all relevant fields are empty in " cite$ * warning$ }
'skip$
if$
}
FUNCTION {format.thesis.type}
{ type duplicate$ empty$
'pop$
{ swap$ pop$
"t" change.case$ "type" bibinfo.check
}
if$
}
FUNCTION {format.tr.number}
{ number "number" bibinfo.check
type duplicate$ empty$
{ pop$ bbl.techrep }
'skip$
if$
"type" bibinfo.check
swap$ duplicate$ empty$
{ pop$ "t" change.case$ }
{ tie.or.space.prefix * * }
if$
}
FUNCTION {format.article.crossref}
{
key duplicate$ empty$
{ pop$
journal duplicate$ empty$
{ "need key or journal for " cite$ * " to crossref " * crossref * warning$ }
{ "journal" bibinfo.check emphasize word.in swap$ * }
if$
}
{ word.in swap$ * " " *}
if$
" \cite{" * crossref * "}" *
}
FUNCTION {format.crossref.editor}
{ editor #1 "{vv~}{ll}" format.name$
"editor" bibinfo.check
editor num.names$ duplicate$
#2 >
{ pop$
"editor" bibinfo.check
" " * bbl.etal
*
}
{ #2 <
'skip$
{ editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
{
"editor" bibinfo.check
" " * bbl.etal
*
}
{
bbl.and space.word
* editor #2 "{vv~}{ll}" format.name$
"editor" bibinfo.check
*
}
if$
}
if$
}
if$
}
FUNCTION {format.book.crossref}
{ volume duplicate$ empty$
{ "empty volume in " cite$ * "'s crossref of " * crossref * warning$
pop$ word.in
}
{ bbl.volume
capitalize
swap$ tie.or.space.prefix "volume" bibinfo.check * * bbl.of space.word *
}
if$
editor empty$
editor field.or.null author field.or.null =
or
{ key empty$
{ series empty$
{ "need editor, key, or series for " cite$ * " to crossref " *
crossref * warning$
"" *
}
{ series emphasize * }
if$
}
{ key * }
if$
}
{ format.crossref.editor * }
if$
" \cite{" * crossref * "}" *
}
FUNCTION {format.incoll.inproc.crossref}
{
editor empty$
editor field.or.null author field.or.null =
or
{ key empty$
{ format.booktitle duplicate$ empty$
{ "need editor, key, or booktitle for " cite$ * " to crossref " *
crossref * warning$
}
{ word.in swap$ * }
if$
}
{ word.in key * " " *}
if$
}
{ word.in format.crossref.editor * " " *}
if$
" \cite{" * crossref * "}" *
}
FUNCTION {format.org.or.pub}
{ 't :=
""
address empty$ t empty$ and
'skip$
{
t empty$
{ address "address" bibinfo.check *
}
{ t *
address empty$
'skip$
{ ", " * address "address" bibinfo.check * }
if$
}
if$
}
if$
}
FUNCTION {format.publisher.address}
{ publisher "publisher" bibinfo.warn format.org.or.pub
}
FUNCTION {format.organization.address}
{ organization "organization" bibinfo.check format.org.or.pub
}
FUNCTION {article}
{ output.bibitem
format.authors "author" output.check
add.colon
new.block
format.title "title" output.check
new.block
crossref missing$
{
journal
"journal" bibinfo.check
"journal" output.check
add.blank
format.vol.num.pages output
format.date "year" output.check
}
{ format.article.crossref output.nonnull
format.pages output
}
if$
% new.block
format.doi output
format.url output
% new.block
format.note output
fin.entry
}
FUNCTION {book}
{ output.bibitem
author empty$
{ format.editors "author and editor" output.check
add.colon
}
{ format.authors output.nonnull
add.colon
crossref missing$
{ "author and editor" editor either.or.check }
'skip$
if$
}
if$
new.block
format.btitle "title" output.check
crossref missing$
{ format.bvolume output
new.block
new.sentence
format.number.series output
format.publisher.address output
}
{
new.block
format.book.crossref output.nonnull
}
if$
format.edition output
format.date "year" output.check
% new.block
format.doi output
format.url output
% new.block
format.note output
fin.entry
}
FUNCTION {booklet}
{ output.bibitem
format.authors output
add.colon
new.block
format.title "title" output.check
new.block
howpublished "howpublished" bibinfo.check output
address "address" bibinfo.check output
format.date output
% new.block
format.doi output
format.url output
% new.block
format.note output
fin.entry
}
FUNCTION {inbook}
{ output.bibitem
author empty$
{ format.editors "author and editor" output.check
add.colon
}
{ format.authors output.nonnull
add.colon
crossref missing$
{ "author and editor" editor either.or.check }
'skip$
if$
}
if$
new.block
format.btitle "title" output.check
crossref missing$
{
format.bvolume output
format.chapter.pages "chapter and pages" output.check
new.block
new.sentence
format.number.series output
format.publisher.address output
}
{
format.chapter.pages "chapter and pages" output.check
new.block
format.book.crossref output.nonnull
}
if$
format.edition output
format.date "year" output.check
% new.block
format.doi output
format.url output
% new.block
format.note output
fin.entry
}
FUNCTION {incollection}
{ output.bibitem
format.authors "author" output.check
add.colon
new.block
format.title "title" output.check
new.block
crossref missing$
{ format.in.ed.booktitle "booktitle" output.check
format.bvolume output
format.chapter.pages output
new.sentence
format.number.series output
format.publisher.address output
format.edition output
format.date "year" output.check
}
{ format.incoll.inproc.crossref output.nonnull
format.chapter.pages output
}
if$
% new.block
format.doi output
format.url output
% new.block
format.note output
fin.entry
}
FUNCTION {inproceedings}
{ output.bibitem
format.authors "author" output.check
add.colon
new.block
format.title "title" output.check
new.block
crossref missing$
{ format.in.ed.booktitle "booktitle" output.check
new.sentence % added by titto
format.bvolume output
format.pages output
new.sentence
format.number.series output
publisher empty$
{ format.organization.address output }
{ organization "organization" bibinfo.check output
format.publisher.address output
}
if$
format.date "year" output.check
}
{ format.incoll.inproc.crossref output.nonnull
format.pages output
}
if$
% new.block
format.doi output
format.url output
% new.block
format.note output
fin.entry
}
FUNCTION {conference} { inproceedings }
FUNCTION {manual}
{ output.bibitem
author empty$
{ organization "organization" bibinfo.check
duplicate$ empty$ 'pop$
{ output
address "address" bibinfo.check output
}
if$
}
{ format.authors output.nonnull }
if$
add.colon
new.block
format.btitle "title" output.check
author empty$
{ organization empty$
{
address new.block.checka
address "address" bibinfo.check output
}
'skip$
if$
}
{
organization address new.block.checkb
organization "organization" bibinfo.check output
address "address" bibinfo.check output
}
if$
format.edition output
format.date output
% new.block
format.doi output
format.url output
% new.block
format.note output
fin.entry
}
FUNCTION {mastersthesis}
{ output.bibitem
format.authors "author" output.check
add.colon
new.block
format.btitle
"title" output.check
new.block
bbl.mthesis format.thesis.type output.nonnull
school "school" bibinfo.warn output
address "address" bibinfo.check output
format.date "year" output.check
% new.block
format.doi output
format.url output
% new.block
format.note output
fin.entry
}
FUNCTION {misc}
{ output.bibitem
format.authors output
add.colon
title howpublished new.block.checkb
format.title output
howpublished new.block.checka
howpublished "howpublished" bibinfo.check output
format.date output
% new.block
format.doi output
format.url output
% new.block
format.note output
fin.entry
empty.misc.check
}
FUNCTION {phdthesis}
{ output.bibitem
format.authors "author" output.check
add.colon
new.block
format.btitle
"title" output.check
new.block
bbl.phdthesis format.thesis.type output.nonnull
school "school" bibinfo.warn output
address "address" bibinfo.check output
format.date "year" output.check
% new.block
format.doi output
format.url output
% new.block
format.note output
fin.entry
}
FUNCTION {proceedings}
{ output.bibitem
editor empty$
{ organization "organization" bibinfo.check output
}
{ format.editors output.nonnull }
if$
add.colon
new.block
format.btitle "title" output.check
format.bvolume output
editor empty$
{ publisher empty$
{ format.number.series output }
{
new.sentence
format.number.series output
format.publisher.address output
}
if$
}
{ publisher empty$
{
new.sentence
format.number.series output
format.organization.address output }
{
new.sentence
format.number.series output
organization "organization" bibinfo.check output
format.publisher.address output
}
if$
}
if$
format.date "year" output.check
% new.block
format.doi output
format.url output
% new.block
format.note output
fin.entry
}
FUNCTION {techreport}
{ output.bibitem
format.authors "author" output.check
add.colon
new.block
format.title
"title" output.check
new.block
format.tr.number output.nonnull
institution "institution" bibinfo.warn output
address "address" bibinfo.check output
format.date "year" output.check
% new.block
format.doi output
format.url output
% new.block
format.note output
fin.entry
}
FUNCTION {unpublished}
{ output.bibitem
format.authors "author" output.check
add.colon
new.block
format.title "title" output.check
format.date output
% new.block
format.url output
% new.block
format.note "note" output.check
fin.entry
}
FUNCTION {default.type} { misc }
READ
FUNCTION {sortify}
{ purify$
"l" change.case$
}
INTEGERS { len }
FUNCTION {chop.word}
{ 's :=
'len :=
s #1 len substring$ =
{ s len #1 + global.max$ substring$ }
's
if$
}
FUNCTION {sort.format.names}
{ 's :=
#1 'nameptr :=
""
s num.names$ 'numnames :=
numnames 'namesleft :=
{ namesleft #0 > }
{ s nameptr
"{ll{ }}{ ff{ }}{ jj{ }}"
format.name$ 't :=
nameptr #1 >
{
" " *
namesleft #1 = t "others" = and
{ "zzzzz" * }
{ t sortify * }
if$
}
{ t sortify * }
if$
nameptr #1 + 'nameptr :=
namesleft #1 - 'namesleft :=
}
while$
}
FUNCTION {sort.format.title}
{ 't :=
"A " #2
"An " #3
"The " #4 t chop.word
chop.word
chop.word
sortify
#1 global.max$ substring$
}
FUNCTION {author.sort}
{ author empty$
{ key empty$
{ "to sort, need author or key in " cite$ * warning$
""
}
{ key sortify }
if$
}
{ author sort.format.names }
if$
}
FUNCTION {author.editor.sort}
{ author empty$
{ editor empty$
{ key empty$
{ "to sort, need author, editor, or key in " cite$ * warning$
""
}
{ key sortify }
if$
}
{ editor sort.format.names }
if$
}
{ author sort.format.names }
if$
}
FUNCTION {author.organization.sort}
{ author empty$
{ organization empty$
{ key empty$
{ "to sort, need author, organization, or key in " cite$ * warning$
""
}
{ key sortify }
if$
}
{ "The " #4 organization chop.word sortify }
if$
}
{ author sort.format.names }
if$
}
FUNCTION {editor.organization.sort}
{ editor empty$
{ organization empty$
{ key empty$
{ "to sort, need editor, organization, or key in " cite$ * warning$
""
}
{ key sortify }
if$
}
{ "The " #4 organization chop.word sortify }
if$
}
{ editor sort.format.names }
if$
}
FUNCTION {presort}
{ type$ "book" =
type$ "inbook" =
or
'author.editor.sort
{ type$ "proceedings" =
'editor.organization.sort
{ type$ "manual" =
'author.organization.sort
'author.sort
if$
}
if$
}
if$
" "
*
year field.or.null sortify
*
" "
*
title field.or.null
sort.format.title
*
#1 entry.max$ substring$
'sort.key$ :=
}
ITERATE {presort}
SORT
STRINGS { longest.label }
INTEGERS { number.label longest.label.width }
FUNCTION {initialize.longest.label}
{ "" 'longest.label :=
#1 'number.label :=
#0 'longest.label.width :=
}
FUNCTION {longest.label.pass}
{ number.label int.to.str$ 'label :=
number.label #1 + 'number.label :=
label width$ longest.label.width >
{ label 'longest.label :=
label width$ 'longest.label.width :=
}
'skip$
if$
}
EXECUTE {initialize.longest.label}
ITERATE {longest.label.pass}
FUNCTION {begin.bib}
{ preamble$ empty$
'skip$
{ preamble$ write$ newline$ }
if$
"\begin{thebibliography}{" longest.label * "}" *
write$ newline$
"\providecommand{\url}[1]{\texttt{#1}}"
write$ newline$
"\providecommand{\urlprefix}{URL }"
write$ newline$
"\providecommand{\doi}[1]{https://doi.org/#1}"
write$ newline$
}
EXECUTE {begin.bib}
EXECUTE {init.state.consts}
ITERATE {call.type$}
FUNCTION {end.bib}
{ newline$
"\end{thebibliography}" write$ newline$
}
EXECUTE {end.bib}
%% End of customized bst file
%%
%% End of file `titto.bst'.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment