|
| 1 | +\begin{MintedVerbatim}[commandchars=\\\{\},codes={\catcode`\$=3\catcode`\^=7\catcode`\_=8\relax}] |
| 2 | +\PYG{k+kn}{import}\PYG{+w}{ }\PYG{n+nn}{numpy}\PYG{+w}{ }\PYG{k}{as}\PYG{+w}{ }\PYG{n+nn}{np} |
| 3 | +\PYG{k+kn}{import}\PYG{+w}{ }\PYG{n+nn}{torch} |
| 4 | +\PYG{k+kn}{import}\PYG{+w}{ }\PYG{n+nn}{torch}\PYG{n+nn}{.}\PYG{n+nn}{utils}\PYG{n+nn}{.}\PYG{n+nn}{data} |
| 5 | +\PYG{k+kn}{import}\PYG{+w}{ }\PYG{n+nn}{torch}\PYG{n+nn}{.}\PYG{n+nn}{nn}\PYG{+w}{ }\PYG{k}{as}\PYG{+w}{ }\PYG{n+nn}{nn} |
| 6 | +\PYG{k+kn}{import}\PYG{+w}{ }\PYG{n+nn}{torch}\PYG{n+nn}{.}\PYG{n+nn}{nn}\PYG{n+nn}{.}\PYG{n+nn}{functional}\PYG{+w}{ }\PYG{k}{as}\PYG{+w}{ }\PYG{n+nn}{F} |
| 7 | +\PYG{k+kn}{import}\PYG{+w}{ }\PYG{n+nn}{torch}\PYG{n+nn}{.}\PYG{n+nn}{optim}\PYG{+w}{ }\PYG{k}{as}\PYG{+w}{ }\PYG{n+nn}{optim} |
| 8 | +\PYG{k+kn}{from}\PYG{+w}{ }\PYG{n+nn}{torch}\PYG{n+nn}{.}\PYG{n+nn}{autograd}\PYG{+w}{ }\PYG{k+kn}{import} \PYG{n}{Variable} |
| 9 | +\PYG{k+kn}{from}\PYG{+w}{ }\PYG{n+nn}{torchvision}\PYG{+w}{ }\PYG{k+kn}{import} \PYG{n}{datasets}\PYG{p}{,} \PYG{n}{transforms} |
| 10 | +\PYG{k+kn}{from}\PYG{+w}{ }\PYG{n+nn}{torchvision}\PYG{n+nn}{.}\PYG{n+nn}{utils}\PYG{+w}{ }\PYG{k+kn}{import} \PYG{n}{make\PYGZus{}grid} \PYG{p}{,} \PYG{n}{save\PYGZus{}image} |
| 11 | +\PYG{k+kn}{import}\PYG{+w}{ }\PYG{n+nn}{matplotlib}\PYG{n+nn}{.}\PYG{n+nn}{pyplot}\PYG{+w}{ }\PYG{k}{as}\PYG{+w}{ }\PYG{n+nn}{plt} |
| 12 | + |
| 13 | + |
| 14 | +\PYG{n}{batch\PYGZus{}size} \PYG{o}{=} \PYG{l+m+mi}{64} |
| 15 | +\PYG{n}{train\PYGZus{}loader} \PYG{o}{=} \PYG{n}{torch}\PYG{o}{.}\PYG{n}{utils}\PYG{o}{.}\PYG{n}{data}\PYG{o}{.}\PYG{n}{DataLoader}\PYG{p}{(} |
| 16 | +\PYG{n}{datasets}\PYG{o}{.}\PYG{n}{MNIST}\PYG{p}{(}\PYG{l+s+s1}{\PYGZsq{}}\PYG{l+s+s1}{./data}\PYG{l+s+s1}{\PYGZsq{}}\PYG{p}{,} |
| 17 | + \PYG{n}{train}\PYG{o}{=}\PYG{k+kc}{True}\PYG{p}{,} |
| 18 | + \PYG{n}{download} \PYG{o}{=} \PYG{k+kc}{True}\PYG{p}{,} |
| 19 | + \PYG{n}{transform} \PYG{o}{=} \PYG{n}{transforms}\PYG{o}{.}\PYG{n}{Compose}\PYG{p}{(} |
| 20 | + \PYG{p}{[}\PYG{n}{transforms}\PYG{o}{.}\PYG{n}{ToTensor}\PYG{p}{(}\PYG{p}{)}\PYG{p}{]}\PYG{p}{)} |
| 21 | + \PYG{p}{)}\PYG{p}{,} |
| 22 | + \PYG{n}{batch\PYGZus{}size}\PYG{o}{=}\PYG{n}{batch\PYGZus{}size} |
| 23 | +\PYG{p}{)} |
| 24 | + |
| 25 | +\PYG{n}{test\PYGZus{}loader} \PYG{o}{=} \PYG{n}{torch}\PYG{o}{.}\PYG{n}{utils}\PYG{o}{.}\PYG{n}{data}\PYG{o}{.}\PYG{n}{DataLoader}\PYG{p}{(} |
| 26 | +\PYG{n}{datasets}\PYG{o}{.}\PYG{n}{MNIST}\PYG{p}{(}\PYG{l+s+s1}{\PYGZsq{}}\PYG{l+s+s1}{./data}\PYG{l+s+s1}{\PYGZsq{}}\PYG{p}{,} |
| 27 | + \PYG{n}{train}\PYG{o}{=}\PYG{k+kc}{False}\PYG{p}{,} |
| 28 | + \PYG{n}{transform}\PYG{o}{=}\PYG{n}{transforms}\PYG{o}{.}\PYG{n}{Compose}\PYG{p}{(} |
| 29 | + \PYG{p}{[}\PYG{n}{transforms}\PYG{o}{.}\PYG{n}{ToTensor}\PYG{p}{(}\PYG{p}{)}\PYG{p}{]}\PYG{p}{)} |
| 30 | + \PYG{p}{)}\PYG{p}{,} |
| 31 | + \PYG{n}{batch\PYGZus{}size}\PYG{o}{=}\PYG{n}{batch\PYGZus{}size}\PYG{p}{)} |
| 32 | + |
| 33 | + |
| 34 | +\PYG{k}{class}\PYG{+w}{ }\PYG{n+nc}{RBM}\PYG{p}{(}\PYG{n}{nn}\PYG{o}{.}\PYG{n}{Module}\PYG{p}{)}\PYG{p}{:} |
| 35 | + \PYG{k}{def}\PYG{+w}{ }\PYG{n+nf+fm}{\PYGZus{}\PYGZus{}init\PYGZus{}\PYGZus{}}\PYG{p}{(}\PYG{n+nb+bp}{self}\PYG{p}{,} |
| 36 | + \PYG{n}{n\PYGZus{}vis}\PYG{o}{=}\PYG{l+m+mi}{784}\PYG{p}{,} |
| 37 | + \PYG{n}{n\PYGZus{}hin}\PYG{o}{=}\PYG{l+m+mi}{500}\PYG{p}{,} |
| 38 | + \PYG{n}{k}\PYG{o}{=}\PYG{l+m+mi}{5}\PYG{p}{)}\PYG{p}{:} |
| 39 | + \PYG{n+nb}{super}\PYG{p}{(}\PYG{n}{RBM}\PYG{p}{,} \PYG{n+nb+bp}{self}\PYG{p}{)}\PYG{o}{.}\PYG{n+nf+fm}{\PYGZus{}\PYGZus{}init\PYGZus{}\PYGZus{}}\PYG{p}{(}\PYG{p}{)} |
| 40 | + \PYG{n+nb+bp}{self}\PYG{o}{.}\PYG{n}{W} \PYG{o}{=} \PYG{n}{nn}\PYG{o}{.}\PYG{n}{Parameter}\PYG{p}{(}\PYG{n}{torch}\PYG{o}{.}\PYG{n}{randn}\PYG{p}{(}\PYG{n}{n\PYGZus{}hin}\PYG{p}{,}\PYG{n}{n\PYGZus{}vis}\PYG{p}{)}\PYG{o}{*}\PYG{l+m+mf}{1e\PYGZhy{}2}\PYG{p}{)} |
| 41 | + \PYG{n+nb+bp}{self}\PYG{o}{.}\PYG{n}{v\PYGZus{}bias} \PYG{o}{=} \PYG{n}{nn}\PYG{o}{.}\PYG{n}{Parameter}\PYG{p}{(}\PYG{n}{torch}\PYG{o}{.}\PYG{n}{zeros}\PYG{p}{(}\PYG{n}{n\PYGZus{}vis}\PYG{p}{)}\PYG{p}{)} |
| 42 | + \PYG{n+nb+bp}{self}\PYG{o}{.}\PYG{n}{h\PYGZus{}bias} \PYG{o}{=} \PYG{n}{nn}\PYG{o}{.}\PYG{n}{Parameter}\PYG{p}{(}\PYG{n}{torch}\PYG{o}{.}\PYG{n}{zeros}\PYG{p}{(}\PYG{n}{n\PYGZus{}hin}\PYG{p}{)}\PYG{p}{)} |
| 43 | + \PYG{n+nb+bp}{self}\PYG{o}{.}\PYG{n}{k} \PYG{o}{=} \PYG{n}{k} |
| 44 | + |
| 45 | + \PYG{k}{def}\PYG{+w}{ }\PYG{n+nf}{sample\PYGZus{}from\PYGZus{}p}\PYG{p}{(}\PYG{n+nb+bp}{self}\PYG{p}{,}\PYG{n}{p}\PYG{p}{)}\PYG{p}{:} |
| 46 | + \PYG{k}{return} \PYG{n}{F}\PYG{o}{.}\PYG{n}{relu}\PYG{p}{(}\PYG{n}{torch}\PYG{o}{.}\PYG{n}{sign}\PYG{p}{(}\PYG{n}{p} \PYG{o}{\PYGZhy{}} \PYG{n}{Variable}\PYG{p}{(}\PYG{n}{torch}\PYG{o}{.}\PYG{n}{rand}\PYG{p}{(}\PYG{n}{p}\PYG{o}{.}\PYG{n}{size}\PYG{p}{(}\PYG{p}{)}\PYG{p}{)}\PYG{p}{)}\PYG{p}{)}\PYG{p}{)} |
| 47 | + |
| 48 | + \PYG{k}{def}\PYG{+w}{ }\PYG{n+nf}{v\PYGZus{}to\PYGZus{}h}\PYG{p}{(}\PYG{n+nb+bp}{self}\PYG{p}{,}\PYG{n}{v}\PYG{p}{)}\PYG{p}{:} |
| 49 | + \PYG{n}{p\PYGZus{}h} \PYG{o}{=} \PYG{n}{F}\PYG{o}{.}\PYG{n}{sigmoid}\PYG{p}{(}\PYG{n}{F}\PYG{o}{.}\PYG{n}{linear}\PYG{p}{(}\PYG{n}{v}\PYG{p}{,}\PYG{n+nb+bp}{self}\PYG{o}{.}\PYG{n}{W}\PYG{p}{,}\PYG{n+nb+bp}{self}\PYG{o}{.}\PYG{n}{h\PYGZus{}bias}\PYG{p}{)}\PYG{p}{)} |
| 50 | + \PYG{n}{sample\PYGZus{}h} \PYG{o}{=} \PYG{n+nb+bp}{self}\PYG{o}{.}\PYG{n}{sample\PYGZus{}from\PYGZus{}p}\PYG{p}{(}\PYG{n}{p\PYGZus{}h}\PYG{p}{)} |
| 51 | + \PYG{k}{return} \PYG{n}{p\PYGZus{}h}\PYG{p}{,}\PYG{n}{sample\PYGZus{}h} |
| 52 | + |
| 53 | + \PYG{k}{def}\PYG{+w}{ }\PYG{n+nf}{h\PYGZus{}to\PYGZus{}v}\PYG{p}{(}\PYG{n+nb+bp}{self}\PYG{p}{,}\PYG{n}{h}\PYG{p}{)}\PYG{p}{:} |
| 54 | + \PYG{n}{p\PYGZus{}v} \PYG{o}{=} \PYG{n}{F}\PYG{o}{.}\PYG{n}{sigmoid}\PYG{p}{(}\PYG{n}{F}\PYG{o}{.}\PYG{n}{linear}\PYG{p}{(}\PYG{n}{h}\PYG{p}{,}\PYG{n+nb+bp}{self}\PYG{o}{.}\PYG{n}{W}\PYG{o}{.}\PYG{n}{t}\PYG{p}{(}\PYG{p}{)}\PYG{p}{,}\PYG{n+nb+bp}{self}\PYG{o}{.}\PYG{n}{v\PYGZus{}bias}\PYG{p}{)}\PYG{p}{)} |
| 55 | + \PYG{n}{sample\PYGZus{}v} \PYG{o}{=} \PYG{n+nb+bp}{self}\PYG{o}{.}\PYG{n}{sample\PYGZus{}from\PYGZus{}p}\PYG{p}{(}\PYG{n}{p\PYGZus{}v}\PYG{p}{)} |
| 56 | + \PYG{k}{return} \PYG{n}{p\PYGZus{}v}\PYG{p}{,}\PYG{n}{sample\PYGZus{}v} |
| 57 | + |
| 58 | + \PYG{k}{def}\PYG{+w}{ }\PYG{n+nf}{forward}\PYG{p}{(}\PYG{n+nb+bp}{self}\PYG{p}{,}\PYG{n}{v}\PYG{p}{)}\PYG{p}{:} |
| 59 | + \PYG{n}{pre\PYGZus{}h1}\PYG{p}{,}\PYG{n}{h1} \PYG{o}{=} \PYG{n+nb+bp}{self}\PYG{o}{.}\PYG{n}{v\PYGZus{}to\PYGZus{}h}\PYG{p}{(}\PYG{n}{v}\PYG{p}{)} |
| 60 | + |
| 61 | + \PYG{n}{h\PYGZus{}} \PYG{o}{=} \PYG{n}{h1} |
| 62 | + \PYG{k}{for} \PYG{n}{\PYGZus{}} \PYG{o+ow}{in} \PYG{n+nb}{range}\PYG{p}{(}\PYG{n+nb+bp}{self}\PYG{o}{.}\PYG{n}{k}\PYG{p}{)}\PYG{p}{:} |
| 63 | + \PYG{n}{pre\PYGZus{}v\PYGZus{}}\PYG{p}{,}\PYG{n}{v\PYGZus{}} \PYG{o}{=} \PYG{n+nb+bp}{self}\PYG{o}{.}\PYG{n}{h\PYGZus{}to\PYGZus{}v}\PYG{p}{(}\PYG{n}{h\PYGZus{}}\PYG{p}{)} |
| 64 | + \PYG{n}{pre\PYGZus{}h\PYGZus{}}\PYG{p}{,}\PYG{n}{h\PYGZus{}} \PYG{o}{=} \PYG{n+nb+bp}{self}\PYG{o}{.}\PYG{n}{v\PYGZus{}to\PYGZus{}h}\PYG{p}{(}\PYG{n}{v\PYGZus{}}\PYG{p}{)} |
| 65 | + |
| 66 | + \PYG{k}{return} \PYG{n}{v}\PYG{p}{,}\PYG{n}{v\PYGZus{}} |
| 67 | + |
| 68 | + \PYG{k}{def}\PYG{+w}{ }\PYG{n+nf}{free\PYGZus{}energy}\PYG{p}{(}\PYG{n+nb+bp}{self}\PYG{p}{,}\PYG{n}{v}\PYG{p}{)}\PYG{p}{:} |
| 69 | + \PYG{n}{vbias\PYGZus{}term} \PYG{o}{=} \PYG{n}{v}\PYG{o}{.}\PYG{n}{mv}\PYG{p}{(}\PYG{n+nb+bp}{self}\PYG{o}{.}\PYG{n}{v\PYGZus{}bias}\PYG{p}{)} |
| 70 | + \PYG{n}{wx\PYGZus{}b} \PYG{o}{=} \PYG{n}{F}\PYG{o}{.}\PYG{n}{linear}\PYG{p}{(}\PYG{n}{v}\PYG{p}{,}\PYG{n+nb+bp}{self}\PYG{o}{.}\PYG{n}{W}\PYG{p}{,}\PYG{n+nb+bp}{self}\PYG{o}{.}\PYG{n}{h\PYGZus{}bias}\PYG{p}{)} |
| 71 | + \PYG{n}{hidden\PYGZus{}term} \PYG{o}{=} \PYG{n}{wx\PYGZus{}b}\PYG{o}{.}\PYG{n}{exp}\PYG{p}{(}\PYG{p}{)}\PYG{o}{.}\PYG{n}{add}\PYG{p}{(}\PYG{l+m+mi}{1}\PYG{p}{)}\PYG{o}{.}\PYG{n}{log}\PYG{p}{(}\PYG{p}{)}\PYG{o}{.}\PYG{n}{sum}\PYG{p}{(}\PYG{l+m+mi}{1}\PYG{p}{)} |
| 72 | + \PYG{k}{return} \PYG{p}{(}\PYG{o}{\PYGZhy{}}\PYG{n}{hidden\PYGZus{}term} \PYG{o}{\PYGZhy{}} \PYG{n}{vbias\PYGZus{}term}\PYG{p}{)}\PYG{o}{.}\PYG{n}{mean}\PYG{p}{(}\PYG{p}{)} |
| 73 | + |
| 74 | + |
| 75 | + |
| 76 | + |
| 77 | +\PYG{n}{rbm} \PYG{o}{=} \PYG{n}{RBM}\PYG{p}{(}\PYG{n}{k}\PYG{o}{=}\PYG{l+m+mi}{1}\PYG{p}{)} |
| 78 | +\PYG{n}{train\PYGZus{}op} \PYG{o}{=} \PYG{n}{optim}\PYG{o}{.}\PYG{n}{SGD}\PYG{p}{(}\PYG{n}{rbm}\PYG{o}{.}\PYG{n}{parameters}\PYG{p}{(}\PYG{p}{)}\PYG{p}{,}\PYG{l+m+mf}{0.1}\PYG{p}{)} |
| 79 | + |
| 80 | +\PYG{k}{for} \PYG{n}{epoch} \PYG{o+ow}{in} \PYG{n+nb}{range}\PYG{p}{(}\PYG{l+m+mi}{10}\PYG{p}{)}\PYG{p}{:} |
| 81 | + \PYG{n}{loss\PYGZus{}} \PYG{o}{=} \PYG{p}{[}\PYG{p}{]} |
| 82 | + \PYG{k}{for} \PYG{n}{\PYGZus{}}\PYG{p}{,} \PYG{p}{(}\PYG{n}{data}\PYG{p}{,}\PYG{n}{target}\PYG{p}{)} \PYG{o+ow}{in} \PYG{n+nb}{enumerate}\PYG{p}{(}\PYG{n}{train\PYGZus{}loader}\PYG{p}{)}\PYG{p}{:} |
| 83 | + \PYG{n}{data} \PYG{o}{=} \PYG{n}{Variable}\PYG{p}{(}\PYG{n}{data}\PYG{o}{.}\PYG{n}{view}\PYG{p}{(}\PYG{o}{\PYGZhy{}}\PYG{l+m+mi}{1}\PYG{p}{,}\PYG{l+m+mi}{784}\PYG{p}{)}\PYG{p}{)} |
| 84 | + \PYG{n}{sample\PYGZus{}data} \PYG{o}{=} \PYG{n}{data}\PYG{o}{.}\PYG{n}{bernoulli}\PYG{p}{(}\PYG{p}{)} |
| 85 | + |
| 86 | + \PYG{n}{v}\PYG{p}{,}\PYG{n}{v1} \PYG{o}{=} \PYG{n}{rbm}\PYG{p}{(}\PYG{n}{sample\PYGZus{}data}\PYG{p}{)} |
| 87 | + \PYG{n}{loss} \PYG{o}{=} \PYG{n}{rbm}\PYG{o}{.}\PYG{n}{free\PYGZus{}energy}\PYG{p}{(}\PYG{n}{v}\PYG{p}{)} \PYG{o}{\PYGZhy{}} \PYG{n}{rbm}\PYG{o}{.}\PYG{n}{free\PYGZus{}energy}\PYG{p}{(}\PYG{n}{v1}\PYG{p}{)} |
| 88 | + \PYG{n}{loss\PYGZus{}}\PYG{o}{.}\PYG{n}{append}\PYG{p}{(}\PYG{n}{loss}\PYG{o}{.}\PYG{n}{data}\PYG{p}{)} |
| 89 | + \PYG{n}{train\PYGZus{}op}\PYG{o}{.}\PYG{n}{zero\PYGZus{}grad}\PYG{p}{(}\PYG{p}{)} |
| 90 | + \PYG{n}{loss}\PYG{o}{.}\PYG{n}{backward}\PYG{p}{(}\PYG{p}{)} |
| 91 | + \PYG{n}{train\PYGZus{}op}\PYG{o}{.}\PYG{n}{step}\PYG{p}{(}\PYG{p}{)} |
| 92 | + |
| 93 | + \PYG{n+nb}{print}\PYG{p}{(}\PYG{l+s+s2}{\PYGZdq{}}\PYG{l+s+s2}{Training loss for }\PYG{l+s+si}{\PYGZob{}\PYGZcb{}}\PYG{l+s+s2}{ epoch: }\PYG{l+s+si}{\PYGZob{}\PYGZcb{}}\PYG{l+s+s2}{\PYGZdq{}}\PYG{o}{.}\PYG{n}{format}\PYG{p}{(}\PYG{n}{epoch}\PYG{p}{,} \PYG{n}{np}\PYG{o}{.}\PYG{n}{mean}\PYG{p}{(}\PYG{n}{loss\PYGZus{}}\PYG{p}{)}\PYG{p}{)}\PYG{p}{)} |
| 94 | + |
| 95 | + |
| 96 | +\PYG{k}{def}\PYG{+w}{ }\PYG{n+nf}{show\PYGZus{}adn\PYGZus{}save}\PYG{p}{(}\PYG{n}{file\PYGZus{}name}\PYG{p}{,}\PYG{n}{img}\PYG{p}{)}\PYG{p}{:} |
| 97 | + \PYG{n}{npimg} \PYG{o}{=} \PYG{n}{np}\PYG{o}{.}\PYG{n}{transpose}\PYG{p}{(}\PYG{n}{img}\PYG{o}{.}\PYG{n}{numpy}\PYG{p}{(}\PYG{p}{)}\PYG{p}{,}\PYG{p}{(}\PYG{l+m+mi}{1}\PYG{p}{,}\PYG{l+m+mi}{2}\PYG{p}{,}\PYG{l+m+mi}{0}\PYG{p}{)}\PYG{p}{)} |
| 98 | + \PYG{n}{f} \PYG{o}{=} \PYG{l+s+s2}{\PYGZdq{}}\PYG{l+s+s2}{./}\PYG{l+s+si}{\PYGZpc{}s}\PYG{l+s+s2}{.png}\PYG{l+s+s2}{\PYGZdq{}} \PYG{o}{\PYGZpc{}} \PYG{n}{file\PYGZus{}name} |
| 99 | + \PYG{n}{plt}\PYG{o}{.}\PYG{n}{imshow}\PYG{p}{(}\PYG{n}{npimg}\PYG{p}{)} |
| 100 | + \PYG{n}{plt}\PYG{o}{.}\PYG{n}{imsave}\PYG{p}{(}\PYG{n}{f}\PYG{p}{,}\PYG{n}{npimg}\PYG{p}{)} |
| 101 | + |
| 102 | +\PYG{n}{show\PYGZus{}adn\PYGZus{}save}\PYG{p}{(}\PYG{l+s+s2}{\PYGZdq{}}\PYG{l+s+s2}{real}\PYG{l+s+s2}{\PYGZdq{}}\PYG{p}{,}\PYG{n}{make\PYGZus{}grid}\PYG{p}{(}\PYG{n}{v}\PYG{o}{.}\PYG{n}{view}\PYG{p}{(}\PYG{l+m+mi}{32}\PYG{p}{,}\PYG{l+m+mi}{1}\PYG{p}{,}\PYG{l+m+mi}{28}\PYG{p}{,}\PYG{l+m+mi}{28}\PYG{p}{)}\PYG{o}{.}\PYG{n}{data}\PYG{p}{)}\PYG{p}{)} |
| 103 | +\PYG{n}{show\PYGZus{}adn\PYGZus{}save}\PYG{p}{(}\PYG{l+s+s2}{\PYGZdq{}}\PYG{l+s+s2}{generate}\PYG{l+s+s2}{\PYGZdq{}}\PYG{p}{,}\PYG{n}{make\PYGZus{}grid}\PYG{p}{(}\PYG{n}{v1}\PYG{o}{.}\PYG{n}{view}\PYG{p}{(}\PYG{l+m+mi}{32}\PYG{p}{,}\PYG{l+m+mi}{1}\PYG{p}{,}\PYG{l+m+mi}{28}\PYG{p}{,}\PYG{l+m+mi}{28}\PYG{p}{)}\PYG{o}{.}\PYG{n}{data}\PYG{p}{)}\PYG{p}{)} |
| 104 | + |
| 105 | + |
| 106 | +\end{MintedVerbatim} |
0 commit comments