text:
\documentclass[journal=jpcbfk,manuscript=article,layout=singlecolumn,articletitle=true]{achemso}
\setkeys{acs}{articletitle = true}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Place any additional packages needed here.  Only include packages
%% which are essential, to avoid problems later.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage{graphicx,bm,lineno,mathpazo}
\usepackage{amssymb,amsfonts,amsmath,mathtools}
\usepackage{algorithm,algpseudocode,booktabs,dcolumn}
\captionsetup{labelfont=bf}
\usepackage[input-decimal-markers={.},separate-uncertainty=true,table-auto-round,scientific-notation = false,zero-decimal-to-integer=true]{siunitx}
\DeclareMathOperator*{\tr}{tr}
\DeclareMathOperator*{\argmax}{arg\,max}
\usepackage[caption=false,font=normalsize,position=top]{subfig}
\usepackage[kerning,spacing,tracking]{microtype}
\microtypecontext{spacing=nonfrench}
\usepackage{indentfirst}
\overfullrule=5pt
\usepackage[normalem]{ulem}
\usepackage{color}
\usepackage{empheq}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% New command
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newcommand{\boxedeq}[2]{\begin{empheq}[box={\fboxsep=6pt\fbox}]{align}\label{#1}#2\end{empheq}}

\title{The conservation of probability in Fokker-Planck Equation without dark operator}
\author{Yi-Tsao Chen}
\date{December 2019}

\begin{document}

\maketitle

\section{Fokker-Planck Equation(FPE)}
\begin{equation}
\label{eq:FPE}
\frac{\partial p(x,t)}{\partial t} = -D\frac{\partial}{\partial x}\left [ F(x)p(x,t) \right] + D \frac{\partial^2 p(x,t)}{\partial x^2}
\end{equation}
where $D$ is the diffusion coefficient, which is now assumed to be constant, and
\begin{equation}
\label{eq:force}
F(x)=-\frac{d V(x)}{d x}
\end{equation}
for a given potential $V(x)$. Then, we imposed natural boundary conditions,
\begin{align}
\label{eq:BC1}
\lim_{x\to\pm\infty} p(x,t) &= 0
\end{align}
\begin{align}
\label{eq:BC2}
\lim_{x\to\pm\infty} \frac{\partial p(x,t)}{\partial x}&= 0
\end{align}

\section{Continuous equation and probability current}
According to eq (\ref{eq:FPE}),
\begin{equation}
\begin{split}
\label{eq:FPE2}
\frac{\partial p(x,t)}{\partial t}  &= -D\frac{d}{d x}\left [ F(x) p(x,t)\right ] +  D \frac{d^2 p(x,t)}{d x^2}\\
  &= D\frac{d}{d x}\left [ F(x) p(x,t)\right ] -  D \frac{d^2 p(x,t)}{d x^2}\\
  &= -D\frac{d}{d x}\left [ \frac{d V(x)}{d x}p(x,t) + \frac{d p(x,t)}{d x}   \right ]
\end{split}
\end{equation}
Then,
\begin{equation}
\frac{\partial p(x,t)}{\partial t} + D\frac{d}{d x}\left [ \frac{d V(x)}{d x}p(x,t) + \frac{d p(x,t)}{d x}\right] = 0
\end{equation}
As a general continuity equation in a differential form:
\begin{equation}
\frac{\partial p}{\partial t} + \nabla \cdot \mathbf{j} = \sigma
\end{equation}
Here, $\sigma=0$, so
\begin{equation}
\label{eq:continutyeq}
\frac{\partial p}{\partial t} + \nabla \cdot \mathbf{j} = 0
\end{equation}
And $\mathbf{j}(x,t)$ is the current associated with the probability density $p$:
\begin{equation}
\label{eq:currentdefine}
\mathbf{j}(x,t) \equiv \frac{d V(x)}{d x}p(x,t) + \frac{d p(x,t)}{d x}
\end{equation}

\section{The conservation of probability}
Define $\mathcal{N}(t)$ as the integral of the probability density throughout space:
\begin{equation}
\mathcal{N}(t) \equiv \int p(x,t) dx
\end{equation}
We want to show the conservation of probability by the following equation
\begin{equation}
\label{eq:conserpb}
\frac{d \mathcal{N}(t)}{dt} = 0
\end{equation}
We begin by computing the time derivative of $\mathcal{N}(t)$ by using FPE
\begin{equation}
\begin{split}
\frac{d\mathcal{N}(t)}{dt} &= \int_{-\infty}^{\infty}\frac{\partial p(x,t)}{\partial t}dx \\
&= \int_{-\infty}^{\infty}-D\frac{\partial}{\partial x}\left [ \frac{d V(x)}{d x}p(x,t) + \frac{\partial p(x,t)}{\partial x}\right]dx \\
&= -D\int_{-\infty}^{\infty}\frac{\partial \mathbf{j}(x,t)}{\partial x}
\end{split}
\end{equation}
Here, we used eq (\ref{eq:FPE2}) and (\ref{eq:currentdefine}). Then, by natrual boundary conditions eq (\ref{eq:BC1}) and eq (\ref{eq:BC2}), we can get
\begin{equation}
\label{eq:bcconserve}
\begin{split}
\frac{d\mathcal{N}(t)}{dt} &= -D\left [ \mathbf{j}(\infty,t) - \mathbf{j}(-\infty,t)\right ] \\
&= -D\{[\frac{d V(\infty)}{d x}p(\infty,t) + \frac{\partial p(\infty,t)}{\partial x}]-[\frac{d V(-\infty)}{d x}p(-\infty,t) + \frac{\partial p(-\infty,t)}{\partial x}]\} \\
&= -D\{0-0\} = 0
\end{split}
\end{equation}
As you can see, the natural boundary conditions gurantee us the conservation of probability.

\section{The equilibrium probability density}
The equilibrium probability density,~$p_{eq}(x)$, is the long-time limit of $p(x,t)$ at $t\to\infty$
\begin{equation}
\label{eq:dpeqtconstant}
\frac{d p_{eq}(x)}{dt}=0
\end{equation}
Therefore, according to eq (\ref{eq:continutyeq})
\begin{equation}
\nabla \cdot \mathbf{j}_{eq} = 0
\end{equation}
That is,
\begin{equation}
\frac{d}{d x}\left [ \frac{d V(x)}{d x}p_{eq}(x) + \frac{d p_{eq}(x)}{d x}\right] = 0
\end{equation}
So
\begin{equation}
\frac{d V(x)}{d x}p_{eq}(x) + \frac{d p_{eq}(x)}{d x} = C
\end{equation}
Here, $C$ is a constant. And we have already known the value in two boundary as shown in eq. (\ref{eq:bcconserve}). That tells us the constant $C=0$. Therefore,
\begin{equation}
\label{eq:jzero}
\frac{d V(x)}{d x}p_{eq}(x) + \frac{d p_{eq}(x)}{d x} = 0
\end{equation}
Then,
\begin{align}
\frac{d p_{eq}(x)}{d x} &= -\frac{d V(x)}{d x}p_{eq}(x)\\
\frac{d p_{eq}(x)}{p_{eq}(x)} &= -d V(x) \\
\ln{(p_{eq}(x))} &= -V(x)
\end{align}
Finally, we have
\begin{equation}
\label{eq:defpeq}
p_{eq}(x) & = N^{-1} \exp{(-V(x))}= N^{-1}\mathcal{Y}(x)
\end{equation}
where we define
\begin{equation}
\label{eq:Yofx}
\mathcal{Y}(x)\equiv \exp{(-V(x))}
\end{equation}
and $N$ is a constant for normalization,
\begin{equation}
N = \int_{-\infty}^{\infty}\exp{(-V(x))} dx
\end{equation}

\begin{figure}
\includegraphics{figures/peq_dotproduct}
\caption[eigenfunctions]{The left panel: For triple well potential, $\mathcal{Y}(x)= \exp{(-V(x))}$, and after normalizing, we get $p_{eq}(x)$, its quadrature is 1 with respect to weights $w(x)$. The right panel: the eigenvectors $|\psi_i(x)\rangle$ of $\bm{H}^0$ satisfies the completeness relationship.}
\end{figure}

\section{Transform FPE into an equation of Schr\"{o}dinger type}
Starting with the transformation $p(x,t) \rightarrow \rho(x,t)$
\begin{equation}
\label{eq:transform}
p(x,t) = \mathcal{Y}^{1/2}(x)\rho(x,t) \equiv \exp{(\frac{-V(x)}{2})}\rho(x,t)
\end{equation}
This transformation removes the first derivative in the original Fokker-Planck equation and generates the equation of Schr\"{o}dinger type(detail in Appendix A) for the function $\rho(x,t)$, i.e.,
\begin{align}
\label{eq:FPH0}
\frac{\partial \rho(x,t)}{\partial t} &= -\bm{H}^0 \rho(x,t) \\
\bm{H}^0 &= -D\nabla^2  + V_{\rm eff}(x) \\
V_{\rm eff}  &= \frac{DF'(x)}{2} + \frac{DF^2(x)}{4}
\end{align}

\section{Stationary states}
A stationary state is a quantum state with all observables independent of time. We can build stationary states if the potential energy function $V_{\rm eff}(x)$ is time-independent, and that is our case.
Recast our Schr\"{o}dinger-like FPE:
\begin{equation}
\label{eq:recastFPE}
\frac{\partial \Psi_i(x,t)}{\partial t} = -(-D\frac{\partial^2}{\partial x^2}+\frac{DF'(x)}{2} + \frac{DF^2(x)}{4})\Psi(x,t) = -\bm{H}^0 \Psi_i(x,t)
\end{equation}
The signature property of a stationary state is that the position and the time dependence of the wavefunction factorize, which means that
\begin{equation}
\label{eq:factorize}
\Psi_i(x,t) = g_i(t)\psi_i(x)
\end{equation}
Substitute eq(\ref{eq:factorize}) into eq(\ref{eq:recastFPE})
\begin{equation}
(\frac{d g_i(t)}{dt})\psi_i(x)=g_i(t) (-\bm{H}^0 \psi_i(x))
\end{equation}
Then,
\begin{equation}
-\frac{1}{g_i(t)}\frac{d g_i(t)}{dt}=\frac{1}{\psi_i(x)}(\bm{H}^0 \psi_i(x))
\end{equation}
The left-hand side is a function of $t$ only, while the right-hand side is a function of $x$ only because $\bm{H}^0$ contains no time dependent potential. The only way the two sides can equal each other for all values of $t$ and $x$ is for both sides to be equal to a constant $\lambda_i$ with units of $s^{-1}$
\begin{equation}
-\frac{1}{g_i(t)}\frac{d g_i(t)}{dt}=\frac{1}{\psi_i(x)}(\bm{H}^0 \psi_i(x)) = \lambda_i
\end{equation}
Therefore
\begin{equation}
g_i(t) = \exp{(-\lambda_i t)}
\end{equation}
and
\begin{equation}
\label{eq:eigenvalue}
\bm{H}^0\psi_i(x) = \lambda_i \psi_i(x)
\end{equation}
This equation is the eigenvalue equation of $\bm{H}^0$.
Finally, we have
\begin{equation}
\label{Psi_last}
\Psi_i(x,t) = \exp{(-\lambda_i t)}\psi_i(x)
\end{equation}

Furthermore, because $\bm{H}^0$ is a Hermitian operator(detail in Appendix B), it gives the orthonormal eigenvectors and form a complete set. According to spectral theorem, any solution $\rho(x,t)$ of eq(\ref{eq:recastFPE}) can be expressed as:
\begin{equation}
\begin{split}
\label{eq:rhoexpress}
\rho(x,t) &= c_1 \Psi_1(x,t) + c_2 \Psi_2(x,t) + \cdots + c_n \Psi_n(x,t) \\
&= c_1 \exp{(-\lambda_1 t)}\psi_1(x) + c_2 \exp{(-\lambda_2 t)}\psi_2(x) + \cdots + c_n \exp{(-\lambda_n t)}\psi_n(x) \\
&= \sum_{i=1}^{n} c_i \exp{(-\lambda_i t)}\psi_i(x)
\end{split}
\end{equation}

\section{p(x,t)}
Given an initial probability distribution $p(x,0)$, and accroding to eq(\ref{eq:transform}) and eq(\ref{eq:rhoexpress}), we can determine the coefficients $c_i$
\begin{equation}
\begin{split}
p(x,t=0) &= \mathcal{Y}^{1/2}(x)\rho(x,t=0)\\
&= \mathcal{Y}^{1/2}(x)[c_1\psi_1(x)+c_2\psi_2(x)+\cdots+c_n \psi_n(x)]
\end{split}
\end{equation}
After we have $c_i$, we can calculate the probability density at time $t$
\begin{equation}
\label{eq:pevolute}
\begin{split}
p(x,t) &= \mathcal{Y}^{1/2}(x)\rho(x,t)\\
&= \mathcal{Y}^{1/2}(x)[c_1 \exp{(-\lambda_1 t)}\psi_1(x)+c_2 \exp{(-\lambda_2 t)}\psi_2(x)+\cdots+c_n \exp{(-\lambda_n t)}\psi_n(x)]
\end{split}
\end{equation}
Notice $c_1$ will be a constant(Appendix D and Appendix E) for arbitrary initial distribution if we fix the potential $V(x)$ (also $p_eq(x)$). To check whether the probability density is normalizable, we calculate
\begin{equation}
\mathcal{N}(t) \equiv \int p(x,t) dx
\end{equation}

\begin{figure}
\includegraphics{figures/onewell}
\caption[onewell]{The initial probability density corresponds to a one-well harmonic potential. This is the evolution of probability followed the equation \ref{eq:pevolute}.}
\end{figure}

\begin{figure}
\includegraphics{figures/twowell}
\caption[twowell]{The initial probability density corresponds to a double-well potential.}
\end{figure}

\clearpage
\section{Appendix A: Transform FPE into an equation of Schr\"{o}dinger type}
Insert eq (\ref{eq:transform}) into eq (\ref{eq:FPE})
\begin{equation}
\begin{split}
\frac{\partial p(x,t)}{\partial t} = -D\frac{d F(x)}{dx}p(x,t) - DF(x)\frac{\partial p(x,t)}{\partial x} + D \frac{\partial^2 p(x,t)}{\partial x^2}
\end{split}
\end{equation}
Then
\begin{equation}
\begin{split}
\exp{(\frac{-V(x)}{2})}\frac{\partial \rho(x,t)}{\partial t} &= D\frac{d^2 V(x)}{dx^2}\exp{(\frac{-V(x)}{2})}\rho(x,t) -\frac{1}{2}D(\frac{d V(x)}{dx})^{2}\exp{(\frac{-V(x)}{2})}\rho(x,t)\\
&+D\frac{dV(x)}{dx}\exp{(\frac{-V(x)}{2})} \frac{\partial \rho(x,t)}{\partial x} -\frac{1}{2}D\frac{d^2 V(x)}{dx^2}\exp{(\frac{-V(x)}{2})}\rho(x,t)\\
&+\frac{1}{4}D(\frac{d V(x)}{dx})^2\exp{(\frac{-V(x)}{2})}\rho(x,t) -D\frac{d V(x)}{dx}\exp{(\frac{-V(x)}{2})}\frac{\partial \rho(x,t)}{\partial x}\\
&+D\exp{(\frac{-V(x)}{2})} \frac{\partial^2 \rho(x,t)}{\partial x^2} \\
&= \frac{1}{2}D\frac{d^2 V(x)}{dx^2}\exp{(\frac{-V(x)}{2})}\rho(x,t) -\frac{1}{4}D(\frac{d V(x)}{dx})^{2}\exp{(\frac{-V(x)}{2})}\rho(x,t)\\
&+D\exp{(\frac{-V(x)}{2})} \frac{\partial^2 \rho(x,t)}{\partial x^2}
\end{split}
\end{equation}
Multiply $\exp{(\frac{V(x)}{2})}$ on both sides,
\begin{equation}
\frac{\partial \rho(x,t)}{\partial t} = \frac{1}{2}D\frac{d^2 V(x)}{dx^2}\rho(x,t)-\frac{1}{4}D(\frac{d V(x)}{dx})^{2}\rho(x,t) +D\frac{\partial^2 \rho(x,t)}{\partial x^2}
\end{equation}
According to eq(\ref{eq:force}),
\begin{align}
\frac{d^2 V(x)}{dx^2} &= -\frac{dF(x)}{dx}\\
(\frac{d V(x)}{dx})^{2} &= F^2(x)
\end{align}
So, we can get the last form of FPE
\begin{equation}
\frac{\partial \rho(x,t)}{\partial t} = -\frac{1}{2}D\frac{d F(x)}{dx}\rho(x,t)-\frac{1}{4} D F^{2}(x) \rho(x,t) +D\frac{\partial^2 \rho(x,t)}{\partial x^2}
\end{equation}

In the derivation, we used the following equations:
\begin{align}
\frac{\partial p(x,t)}{\partial t} &= \exp{(\frac{-V(x)}{2})}\frac{\partial \rho(x,t)}{\partial t}\\
\frac{\partial(\exp{(\frac{-V(x)}{2})})}{\partial x}&=-\frac{1}{2}\frac{d V(x)}{dx}\exp{(\frac{-V(x)}{2})}
\end{align}
\begin{equation}
\begin{split}
\frac{\partial p(x,t)}{\partial x} &= \frac{\partial \exp{(\frac{-V(x)}{2})}}{\partial x} \rho(x,t)+ \exp{(\frac{-V(x)}{2})} \frac{\partial \rho(x,t)}{\partial x}\\
&= -\frac{1}{2}\frac{d V(x)}{dx}\exp{(\frac{-V(x)}{2})}\rho(x,t)+\exp{(\frac{-V(x)}{2})} \frac{\partial \rho(x,t)}{\partial x}
\end{split}
\end{equation}
\begin{equation}
\begin{split}
\frac{\partial^2 p(x,t)}{\partial x^2} = &-\frac{1}{2}\frac{d^2 V(x)}{dx^2}\exp{(\frac{-V(x)}{2})}\rho(x,t) +  \frac{1}{4}(\frac{d V(x)}{dx})^2\exp{(\frac{-V(x)}{2})}\rho(x,t) \\
&-\frac{1}{2}\frac{d V(x)}{dx}\exp{(\frac{-V(x)}{2})}\frac{\partial \rho(x,t)}{\partial x} -\frac{1}{2}\frac{d V(x)}{dx}\exp{(\frac{-V(x)}{2})}\frac{\partial \rho(x,t)}{\partial x}\\
&+ \exp{(\frac{-V(x)}{2})} \frac{\partial^2 \rho(x,t)}{\partial x^2} \\
= &-\frac{1}{2}\frac{d^2 V(x)}{dx^2}\exp{(\frac{-V(x)}{2})}\rho(x,t) + \frac{1}{4}(\frac{d V(x)}{dx})^2\exp{(\frac{-V(x)}{2})}\rho(x,t) \\
&-\frac{d V(x)}{dx}\exp{(\frac{-V(x)}{2})}\frac{\partial \rho(x,t)}{\partial x} + \exp{(\frac{-V(x)}{2})} \frac{\partial^2 \rho(x,t)}{\partial x^2}
\end{split}
\end{equation}

\clearpage
\section{Appendix B: $\bm{H}^0$ is a Hermitian operator}
If $\bm{H}^0$ is a Hermitian operator for functions $\psi(x)$ which satisfies boundary conditions like eq(\ref{eq:BC1}) and eq(\ref{eq:BC2}), the following equation should hold:
\begin{equation}
\langle \psi_i | \bm{H}^0 \psi_j \rangle = \langle \bm{H}^0 \psi_i | \psi_j \rangle
\end{equation}
or
\begin{equation}
\int_{-\infty}^{\infty}dx \psi^{*}_i \bm{H}^0 \psi_j = \int_{-\infty}^{\infty}dx (\bm{H}^0\psi_i)^* \psi_j
\end{equation}
Starting from the left hand side:
\begin{equation}
\begin{split}
\int_{-\infty}^{\infty}dx \psi^{*}_i \bm{H}^0 \psi_j &= \int_{-\infty}^{\infty}dx \psi^{*}_i [-D \frac{\partial^2 \psi_j}{\partial x^2} + \frac{1}{2}D F'(x)\psi_j + \frac{1}{4}DF^2(x)\psi_j] \\
&= -D\int_{-\infty}^{\infty}\psi^{*}_i \frac{\partial^2 \psi_j}{\partial x^2} dx +\frac{1}{2}D \int_{-\infty}^{\infty} F'(x) \psi^{*}_i \psi_j dx + \frac{1}{4}D\int_{-\infty}^{\infty} \psi^{*}_i F^2(x)\psi_j dx \\
& = D\int_{-\infty}^{\infty} \frac{\partial \psi^*_i}{\partial x} \frac{\partial \psi_j}{\partial x}dx +\frac{1}{2}D \int_{-\infty}^{\infty} F'(x) \psi^{*}_i \psi_j dx + \frac{1}{4}D\int_{-\infty}^{\infty} \psi^{*}_i F^2(x)\psi_j dx
\end{split}
\end{equation}
The right hand side:
\begin{equation}
\begin{split}
\int_{-\infty}^{\infty}dx (\bm{H}^0\psi_i)^* \psi_j &= \int_{-\infty}^{\infty}dx [-D \frac{\partial^2 \psi_i}{\partial x^2} + \frac{1}{2}D F'(x)\psi_i + \frac{1}{4}DF^2(x)\psi_i]^{*}\psi_j \\
&= -D\int_{-\infty}^{\infty}\frac{\partial^2 \psi^*_i}{\partial x^2}\psi_j dx + \frac{1}{2}D\int_{-\infty}^{\infty}F'(x)\psi^*_i \psi_j dx + \frac{1}{4}D\int_{-\infty}^{\infty} F^2(x)\psi^*_i \psi_j dx \\
&= -D\int_{-\infty}^{\infty}\frac{\partial \psi^*_i}{\partial x}\frac{\partial \psi_j}{\partial x} dx + \frac{1}{2}D\int_{-\infty}^{\infty}F'(x)\psi^*_i \psi_j dx + \frac{1}{4}D\int_{-\infty}^{\infty} F^2(x)\psi^*_i \psi_j dx \\
\end{split}
\end{equation}
As you can see, the two sides result in the two functional form, so $\bm{H}^0$ is a Hermitian operator.
Here, we used integration by parts and boundary conditions:
\begin{equation}
\begin{split}
\int_{-\infty}^{\infty}\psi^{*}_i \frac{\partial^2 \psi_j}{\partial x^2} dx &= \int_{-\infty}^{\infty}\psi^{*}_i \frac{\partial}{\partial x}(\frac{\partial \psi_j}{\partial x}) dx \\
& = [\psi^{*}_i \frac{\partial \psi_j}{\partial x}]_{-\infty}^{\infty} - \int_{-\infty}^{\infty} \frac{\partial \psi^*_i}{\partial x} \frac{\partial \psi_j}{\partial x}dx\\
& = - \int_{-\infty}^{\infty} \frac{\partial \psi^*_i}{\partial x} \frac{\partial \psi_j}{\partial x}dx
\end{split}
\end{equation}
\clearpage
\section{Appendix C: When the initial distribution is $\delta(x-x_0)$}
According to eq (\ref{eq:transform}),
\begin{equation}
\label{eq:C1}
p(x,t=0) = \mathcal{Y}^{1/2}(x)\rho(x,t=0) = \delta(x-x_0)
\end{equation}
and further substitute eq (\ref{eq:rhoexpress}) into eq (\ref{eq:C1}),
\begin{equation}
\label{eq:C2}
\mathcal{Y}^{-1/2}(x) \delta(x-x_0) = \sum_{i=1}^{n} c_i \psi_i(x)
\end{equation}
Then we multiply both sides of eq (\ref{eq:C2}) by $\psi_j$
\begin{equation}
\label{eq:C3}
\mathcal{Y}^{-1/2}(x) \psi_j(x) \delta(x-x_0) = \sum_{i=1}^{n} c_i \psi_j(x) \psi_i(x)
\end{equation}
And integrate eq (\ref{eq:C3}) over space
\begin{equation}
\label{eq:C4}
\int_{-\infty}^{\infty} \mathcal{Y}^{-1/2}(x) \psi_j(x) \delta(x-x_0)dx = \int_{-\infty}^{\infty} \sum_{i=1}^{n} c_i \psi_j(x) \psi_i(x) dx
\end{equation}
At last, we can get the coefficients $c_i$
\begin{equation}
\label{eq:C5}
c_i = \mathcal{Y}^{-1/2}(x_0) \psi_i(x_0)
\end{equation}
\clearpage
\section{Appendix D: Solve $\psi_1(x)$}
For $p_{eq}(x)$, there is a corresponding $\rho_{eq}(x)$.
\begin{equation}
p_{eq}(x) = \exp{(\frac{-V(x)}{2})}\rho_{eq}(x)
\end{equation}
According to eq(\ref{eq:jzero})
\begin{equation}
\begin{split}
&\frac{d V(x)}{d x}p_{eq}(x) + \frac{d p_{eq}(x)}{d x}\\
&= \frac{d V(x)}{d x} \exp{(\frac{-V(x)}{2})}\rho_{eq}(x) + \frac{d}{dx}(\exp{(\frac{-V(x)}{2})}\rho_{eq}(x))\\
&= \frac{d V(x)}{d x} \exp{(\frac{-V(x)}{2})}\rho_{eq}(x) - \frac{1}{2}\frac{d V(x)}{d x} \exp{(\frac{-V(x)}{2})}\rho_{eq}(x) + \exp{(\frac{-V(x)}{2})} \frac{d\rho_{eq}(x)}{dx}= 0
\end{split}
\end{equation}
Then, multiply $\exp{(\frac{V(x)}{2})}$ on the both sides
\begin{equation}
\begin{split}
\frac{d\rho_{eq}(x)}{dx} = -\frac{1}{2}\frac{d V(x)}{d x}\rho_{eq}(x)
\end{split}
\end{equation}
Therefore, we obtain
\begin{equation}
\rho_{eq}(x) = C \exp{(-\frac{V(x)}{2})}
\end{equation}
where C is an arbitrary constant.

On the other hand, the equilibrium probability is steady
\begin{equation}
\frac{\partial p_{eq}(x)}{\partial t} = \frac{\partial }{\partial t}(\exp{(\frac{-V(x)}{2})}\rho_{eq}(x)) = 0
\end{equation}
so
\begin{equation}
\frac{\partial \rho_{eq}(x)}{\partial t} = 0
\end{equation}
And according to eq(\ref{eq:recastFPE})
\begin{equation}
\label{eq:D1}
\frac{\partial \rho_{eq}(x)}{\partial t}  = -\bm{H}^0 \rho_{eq}(x) = 0
\end{equation}
This means that there is a eigenvalue is zero, $\lambda_1=0$, and the corresponding eigenvector $\psi_1(x)$
\begin{equation}
\label{eq:D2}
\bm{H}^0 \psi_1(x) = \lambda_1 \psi_1(x) = 0
\end{equation}
At last, by combining eq(\ref{eq:D1}) and eq(\ref{eq:D2}), we get
\begin{equation}
\psi_1(x) = \rho_{eq}(x) = C \exp{(-\frac{V(x)}{2})}
\end{equation}
Here, $C=\sqrt{\frac{1}{\int_{-\infty}^{\infty}\exp{(-V(x))}dx}}=N^{-1/2}$, because
\begin{equation}
\int_{-\infty}^{\infty}|\psi_1(x)|^2 dx = 1
\end{equation}
As a result
\begin{equation}
\label{eq:D3}
\psi_1(x)=\rho_{eq}(x) = \sqrt{p_{eq}(x)}
\end{equation}
\clearpage
\section{Appendix E: $c_1$ is a constant for all initial distributions}
When $t >> 1$, according to eq(\ref{eq:pevolute}) and also $\lambda_1=0$
\begin{equation}
\label{eq:E0}
p(x,t) = p_{eq}(x) = c_1 \mathcal{Y}^{1/2}(x)\psi_1(x)
\end{equation}
Substitute eq(\ref{eq:D3}) into eq(\ref{eq:E0})
\begin{equation}
\label{eq:E1}
p_{eq}(x) = c_1 \exp{(-\frac{V(x)}{2})} N^{-1/2}\exp{(-\frac{V(x)}{2})} = c_1 N^{-1/2} \exp{(-V(x))}
\end{equation}
Then, eq(\ref{eq:defpeq}) gives us
\begin{equation}
\label{eq:E2}
p_{eq}(x) = N^{-1}\mathcal{Y}(x) = N^{-1}\exp{(-V(x))}
\end{equation}
Compare eq(\ref{eq:E1}) and eq(\ref{eq:E2})
\begin{equation}
c_1 = N^{-1/2} = \sqrt{\frac{1}{\int_{-\infty}^{\infty}\exp{(-V(x))}dx}}
\end{equation}
As you can see, $c_1$ is totally determined by $V(x)$, so any initial distributions won't affect it.
\begin{figure}
\includegraphics{figures/c1_constant}
\caption[c1]{$c_1$ is a constant for any initial distribution.}
\end{figure}

\end{document}


text:
%%%%
% This is a template for project reports in the subject DAT620 at the
% Department of Electrical Engineering and Computer Science,
% University of Stavanger.
%
% The template is based on the ACM conference template
% it was edited by Leander Jehl and Hein Meling

\documentclass[sigconf]{acmart}
\usepackage{hyperref}

\input{dat620-setup}

%In the preamble file you can include packages and define macros.
\input{preamble}

\begin{document}
%TODO: Replace the title with your project title.
\title{HackerSearch: an Information Retrieval system}
%you may use a subtitle
\subtitle{Milestone 1}

%TODO replace author names with your name and email below:
\author{Ana Barros}
\affiliation{FEUP}
\email{up201806593@edu.fe.up.pt}

\author{João Costa}
\affiliation{FEUP}
\email{up201806560@edu.fe.up.pt}

\author{João Martins}
\affiliation{FEUP}
\email{up201806436@edu.fe.up.pt}

%TODO: add the name of one or more supervisors
\supervisors{Sara Fernandes and Sérgio Nunes}

\begin{abstract}
    In this project, textual data, corresponding to the year 2018, was
    collected from the ``HackerNews'' link aggregator and corresponding
    linked URLs. After refinement and analysis, this data will be used
    to develop an Information Retrieval system.
\end{abstract}

%TODO: Replace with some keywords, relevant for your project
\keywords{datasets, information retrieval, search engine, HackerNews,
Y Combinator, HackerSearch, data analysis}

\maketitle

%Each section can be placed in a separate file and included by the input command.

\section{Introduction}
\label{sec:introduction}
``HackerNews'' is a link aggregator website, mainly used to share news
and products. It focuses on tech-related topics, such as computer science,
and entrepreneurship. ``HackerNews'' is backed by ``Y Combinator''
foundation, which funds early startups biannually.\\
The community in this website usually interacts by sharing links to
articles (blogs, news websites, and product landing pages) and then,
voting and commenting on them. What sets this community apart is the
vast technical knowledge shown in most comments, giving them a high
readability value which sometimes surpasses the value of the post
discussed.

This article aims to describe the first milestone of the development
of ``HackerSearch''. This platform will serve as an intuitive and
powerful search engine for ``HackerNews'' posts/content.\\
This report is divided into 2 main sections. Each of these sections
describes different tasks completed in order to achieve the final
goal for this \textbf{milestone: data preparation}. The first section,
\hyperref[sec:collection]{Data Collection}, describes the process
of retrieving the data. The second section,
\hyperref[sec:processing]{Data Processing}, describes the filtering
and preparation of the gathered data.
The final section, \hyperref[sec:analysis]{Data Analysis}, lists
the process of exploring the data with statistics,
characterizing the final datasets and their properties, the conceptual
model as well as the follow-up information needs in the data domain.

\section{Data Collection}
\label{sec:collection}
``HackerNews'' provides an \textit{official public API} \cite{API}
to fetch website's data. This data is output in \textbf{JSON format},
and the \textbf{curl} command line utility is used to fetch it.

\subsection{Posts/Stories}
\label{sec:collection_posts}
There are three types of posts in ``HackerNews'': \textbf{story},
\textbf{job}, and \textbf{poll}. It was decided that our dataset
would only contain stories, as those comprise around $99.99\%$ of
posts on the website. From now on, all references to post/story
are interchangeable.

The API \cite{API} does not provide a way to perform bulk downloads. In order
to streamline the process of fetching data, a starting dataset
\cite{githubDataset} was used. This dataset contained the raw data
of stories collected using the API \cite{API}. It is fetched by cloning the
GitHub repository using the git command-line utility. The data
comes divided into several JSON files containing a single list
with multiple objects representing stories. This was done to
bypass GitHub's limit on file size. Upon downloading, these
lists are joined into a single one using the \textbf{jq} \cite{jq}
command-line utility, so the stories can be filtered more easily
and stored in the \textbf{stories.json} file.\\
Given the large volume of data available, it was decided
to only deal with information related to stories posted in
2018. This is equivalent to around 50000 stories.

\subsection{Comments}
The dataset mentioned above only contains data about stories. To
complement this, the API \cite{API} was used to download the data of the
top two comments of each story. This translates to around
100000 comments.\\
To download this data, curl with persistent connections was used,
thus reducing the time expended establishing connections with
the API \cite{API}, and multiple sub-processes, to parallelize work. In
order to easily parallelize the work and make use of persistent
connections in curl, it was necessary to use a file containing URLs
as input. This file was built using \textbf{jq} \cite{jq} (to select the
IDs of the top comments) and \textbf{awk} (to build the URLs using
the IDs that were being piped). Afterwards, it was split info
multiple files (one for each sub-process) using GNU's split,
so each sub-process could take care of their part of the URLs.

\textbf{Jq} \cite{jq} was used to concatenate all the downloaded comment
data into a single JSON list stored in the \textbf{comments.json}
file.

\subsection{URL content}
As stories without a link are frowned upon on ``HackerNews'', most
stories ($90\%$) do not have textual content (apart from the title).
Instead, users are incentivized to share URLs to the content they
want to discuss/share. This limits the searchability of stories.

To work around this, a small program was developed using
Mozilla's Readability tool \cite{readability} (part of the Firefox
browser) to fetch the main content of the URLs linked by the stories
in text form. This allows us to perform general web scraping
in many websites with different layouts/content, which wouldn't
be feasible with a specialized 'web spider'.\\
This code uses \textbf{node-fetch} \cite{node-fetch} to fetch the
target website's data and \textbf{jsdom} \cite{jsdom} to feed this
data to the readability tool \cite{readability}.

\textbf{Jq} \cite{jq} is used to select the stories containing
a URL, and GNU's split is used to divide the information of these
stories into multiple files (each used by a respective sub-process).
The website's extracted textual content is stored in a JSON
object alongside its post ID. Each sub-process stores the
content it is responsible for in a file. The JSON objects in
these files are subsequently concatenated into a single JSON
list using \textbf{jq} \cite{jq} and stored into the
\textbf{html\_content.json} file.

\section{Data Processing}
\label{sec:processing}

\begin{figure*}[htb!]
   \centering
   \includegraphics[width=\linewidth]{fig/dataflow_diagram.png}
    \caption{Dataflow Diagram}
    \label{fig:dataflow_diagram}
\end{figure*}

While being collected and before being analyzed, the data is passed
through a pipeline where it was transformed and filtered.

\subsection{Initial Processing}
The processing and filtering processes described in this
subsection were applied during the data collection process.

In order to reduce the number of stories (while increasing their
relevance), they were filtered out based on the following criteria:
\begin{itemize}
    \item Stories deleted by their owner.
    \item Dead stories (flagged by the users): If a story is reported
        by enough users, it is deleted.
    \item Stories that 'failed': A story 'fails' when it scores
        lower than 5 points, thus not being able to reach the front
        page of the website. Every story starts with 1 point and gains
        1 extra point for each vote it receives.
\end{itemize}
These filtering steps were all performed by a single \textbf{jq}
\cite{jq} script that encompasses all conditions mentioned above.

Comments suffered a similar filtering process (using \textbf{jq} \cite{jq}):
dead and deleted comments were filtered out.
It should be noted that some less popular stories have less than
2 comments in the final dataset, because users might not have
engaged enough in their discussion or all their comments were filtered
out for the reasons above.

The content of the URLs of the stories isn't always useful as textual
data: some URLs link to binary data (images, PDF files, videos, etc...)
and others might lead to web pages that our tool isn't able to extract
information from (e.g.: YouTube's website). In these cases where the URL
doesn't lead to any useful information and the story does not have
textual content, it was decided to 'drop' this from the dataset.\\
When the URL yields useful information (most cases), the yielded
data is compressed to remove repeated blank spaces and newlines,
and filtered to remove non-printable characters. This is done using
a series of piped \textbf{sed} and \textbf{GNU's tr} commands. These
processes are important because the website data is frequently
unstructured and large.

\subsection{Post-Processing}
\label{sec:post_processing}
After all the data was gathered, it was necessary to perform some
final cleanups and save it in a more fitting format: at this point,
the data was saved in three JSON files which needed to be unified.

The 3 JSON files containing the data were imported into python's
\textbf{pandas \cite{pandas} DataFrames} to be worked on. The steps described
below were taken using the \textbf{pandas\cite{pandas} and numpy \cite{numpy}} modules in
python3.

All the stories in the dataset had a \textbf{type} field with
the value \textbf{story}. This happened because only the posts
of that type were downloaded (as mentioned in the
\hyperref[sec:collection_posts]{Posts/Stories Data collection
subsection}. This field was replaced by a new one of the same
name that divides the stories into the dataset in four categories,
recognized by the ``HackerNews'' website, that can be filtered in
their tabs. These categories are:
\begin{itemize}
    \item \textbf{LaunchHN} - these are stories about new
        ``Y Combinator'' backed start-ups. This type of stories
        start their title with \textit{``Launch HN:''}.
    \item \textbf{AskHN} - these are questions to the website's
        community. This type of story can't have a URL, and their
        title almost always starts with \textit{``Ask HN:''}.
        Every story that doesn't have a URL falls in this category.
    \item \textbf{ShowHN} - these are stories that usually want to
        share a product landing/main page. This category is very
        similar to the \textbf{Normal} category discussed below,
        being only distinguished by their title starting with
        \textit{``Show HN:''} and thus being shown in their
        filtered page.
    \item \textbf{Normal} - this is the category where most
        stories fall under. These always have a URL and rarely
        contain a textual description. Most time these link
        to news and scientific articles, or blog posts.
\end{itemize}
The percentage distribution of each of these categories in
the final dataset will be discussed below in the
\hyperref[sec:analysis]{Data Analysis section}.

Both the story data and the comments contain a \textbf{'kids'}
field. This field is a list of the direct descendants of
the respective story/comment.\\
In the case of the stories, their data also contains a
\textbf{descendants} field that represents the number of
child comments in total (across all nesting levels).\\
It was decided that the \textbf{'kids'} field has no value
for the final dataset and, in the case of the comments,
should be used to derive a \textbf{descendants} field
before being dropped. This solution is not optimal as
it doesn't take into account the number of child
comments across all nesting levels, but only the top-level.
It was still decided to use this solution, as it was
infeasible to fetch the data of every comment (over
2.5 million) of the chosen stories in order to count
the number of child comments.

Some data acquired from the ``HackerNews'' API \cite{API},
namely the \textbf{text} fields of both the stories and the
comments, contained HTML special chars escapes. These were
'unescaped' so they could be stored cleanly.

\section{Conceptual Model}
\label{sec:conceptual_model}
After the gathering and passing through the data processing
pipeline, the final data on the \textbf{pandas' DataFrames}
was exported to a sqlite3 database (described in this section),
using the \textbf{sqlalchemy python module}.

\begin{figure}[htb!]
   \centering
   \includegraphics[scale=0.4]{fig/database.png}
    \caption{Conceptual Model}
    \label{fig:database}
\end{figure}

For the data domain, a conceptual model was created in order to
understand the data organization. There are four tables:
\textit{Type, Story, Comment}, and \textit{URL}. The main
attributes of the \textit{Story} table are:
\begin{itemize}
    \item story\_by: the username of the user who posted the story.
    \item story\_descendants: the number of comments of the story.
    \item story\_score: the score of the post (a sum of its upvotes).
    \item story\_time: the (UNIX) timestamp of when the story was posted.
    \item story\_title: the title of the story.
    \item story\_text: the textual content of the story.
    \item story\_type: the type of the story (foreign key to the \textit{Type} table).
\end{itemize}

The \textit{Type} class exists in order to represent the type
of story. All stories have a type. This class contains only
two attributes:

\begin{itemize}
    \item type\_id: the integer that identifies a story type.
    \item type\_name: the name of the type.
\end{itemize}

The \textit{Url} class represents the textual data obtained from
URLs that are linked inside a story. Not every story needs
to have a URL. However, a story cannot have more than one URL.
The main attributes of this table are:

\begin{itemize}
    \item url\_url: the URL of the resource.
    \item url\_text: the filtered textual contents of the
    web resource the URL links to. These contents were obtained
    as described in the
    \hyperref[sec:collection]{Data Collection} section.
\end{itemize}

Finally, the \textit{Comment} table is used to represent
a comment of a story. Each comment only belongs to one story.
Each story might have one, two, or no comments. These are its
main attributes:

\begin{itemize}
    \item comment\_by: the user who posted the comment.
    \item comment\_descendants: the number of replies of a comment
    (as described in the \hyperref[sec:post_processing]{Post Processing subsection}.
    \item comment\_time: the (UNIX) timestamp of when comment was
    posted.
    \item comment\_text: the content of the parent story.
\end{itemize}

\section{Data Characterization/Analysis}
\label{sec:analysis}
This section describes the data characterization using graphics,
plots, and textual descriptions.

\begin{figure}[htb!]
   \centering
   \includegraphics[width=\linewidth]{fig/stories_per_time.png}
    \caption{Number of stories per time}
    \label{fig:stories_per_time}
\end{figure}

By analyzing the dataset, it can be concluded that there is higher
frequency of story posts during the afternoon. Throughout the week,
posts are more frequent during the weekdays as in contrast with
the weekend. Finally, there is not a particular time of the year
when the number of stories posted differentiates from the rest.

The distribution of posts based on type is unbalanced. As described
previously, there are four categories of stories: ``Normal'', ``AskHN'',
``ShowHN'', and ``LaunchHN''. The reality is that $85,5\%$ of all posts
(which translates to almost 33000 posts) are classified as ``Normal''
posts while there are less than 100 posts classified as ``LaunchHN''.
This is expected considering that most posts on ``HackerNews'' intend
on sharing a news article or blog post (most common category) and
``LaunchHN'' posts are a special category for new Y Combinator startups
(less common category). The other two categories fall somewhere in between.

\begin{figure}[htb!]
   \centering
   \includegraphics[width=\linewidth]{fig/descendants_per_type.png}
    \caption{Number of comments per type}
    \label{fig:descendants_per_type}
\end{figure}

`Normal'' stories have a higher ceiling for number of comments (followed
by ``AskHN''), but the median number of comments is roughly the same for
all story types. This is surprising considering that stories that do not
contain a URL (the case of ``AskHN'') are penalized in terms of exposition,
requiring more engagement from users in order to reach the front page
(succeeding).

\begin{figure}[htb!]
   \centering
   \includegraphics[width=\linewidth]{fig/heatmap_score_per_dayandhour.png}
    \caption{Average score in reference to time and day of the week}
    \label{fig:heatmap_score_per_dayandhour}
\end{figure}

By analyzing the heatmap that relates the score of a story with the time
and day of the week of when the story was posted, it can be concluded that
stories posted at the beginning of the week (Monday, Tuesday, Wednesday)
and in the middle of the day (10AM-4PM), achieve higher scores. The average
higher scores are achieved by stories posted between 6AM and 2PM on a
Monday and from 9AM to 6PM on a Tuesday. Most of the high discrepancy between
the cells with the highest score values and its neighboring cells can be
explained by the fact that most outliers occur within these timeframes.
For example, one of the highest rated stories (2776 up-votes) was posted
on Wednesday at 11PM, which has an average score of 138, while its
neighboring cells have a score of 111 and 100.

\begin{figure}[htb!]
   \centering
   \includegraphics[width=\linewidth]{fig/score_per_descendants.png}
    \caption{Score of story per number of comments}
    \label{fig:heatmap_score_per_dayandhour}
\end{figure}

The average score of a story can be related to the number of comments it
has (user engagement). Usually, a higher number of comments, leads to a
higher score. Up until reaching 500 comments, stories' scores stay below
1000 points. Stories with the highest scores  are found between
the interval of 750 and 1000 number of comments. There isn't enough data
to conclude anything about stories with more than 1000 comments, but the
ones that exist in the dataset, appear to score lower than expected
(about the same as stories with 750 to 1000 comments)

\section{Conclusion}
The data analysis allows for the following conclusions: there is enough
data to feed the planned information retrieval system; it is varied in
topics and scopes; the data is of a high quality. All of these factors
and the use of a relational database, to store the data in its final form,
will provide the flexibility and ease of use to advance in the project.\\
With more time, it would be possible to obtain the data relative to all
stories, comments, and possibly even URLs. This would make the temporal
exploration of the data more interesting, allow for the correction of
the approximation made on the comment's descendants count (mentioned in the
\hyperref[sec:post_processing]{Post Processing section}), and create an
even more interesting information retrieval system. Also, it would prove
fruitful to improve the web scrapping part of the pipeline in order to
be able to retrieve textual content from all websites (e.g.: youtube.com)
and some file types (e.g.: PDF, png, jpeg, ...).

\bibliographystyle{ACM-Reference-Format}
\bibliography{sample-bibliography}

\end{document}

ext: tex

max_stars_repo_name: JoaoCostaIFG/PRI

max_issues_repo_name: JoaoCostaIFG/PRI

max_forks_repo_name: JoaoCostaIFG/PRI


text:
\chapter{Introduction}\label{chap:introduction}

%How would a perfect execution order look?

%\todo{What is an execution order?}
%\todo{Who are the agents?}

%This thesis is trying to answer that question by looking at the different execution orders. In other pieces of writing \todo{which?} about epistemic planning the execution order is often unspecified, called an asynchronous execution order. This is easier to describe mathematically, but it also has some drawbacks. We are now going to have a look at the different execution orders, especially at the token based execution order.

Implicit coordination is a technique for planning and coordination of multi-agent systems in which the agents try to collaboratively reach a joint goal. The knowledge and abilities needed to reach a goal can be distributed among the agents. With no centralized coordination instance, the agents need to plan individually and decentrally execute their plans.

%\extend{How old is epistemic planning?}
The field of dynamic epistemic logic is relatively young. It started with the work from Plaza \cite{plaza1989logics} about ``Logics of public communications''.
Epistemic planning investigates techniques and tools of automated planning with formal semantics of communicative actions and knowledge representation.
In regular planning, the world is simplified, so that everyone knows everything there is to know about that particular microverse. But this is only a very simplified model of the real world. In the real world, agents often have only little knowledge and can therefore make only limited calculations and beliefs on that world. To model that, we use epistemic logic. To show that the agents each have different knowledge that can change over time, we describe the logic as being dynamic.

With the asynchronous execution order, every agent can intervene in the execution order at any time. This can potentially harm the execution and prevent the agents from reaching a goal. For example, if two agents have opposing goals with no knowledge about the other agents' goal and the common goal is to reach one of the individual goals, then one agent would always undo the actions of the other agent.

To prevent this from happening, we want to exclude all agents except for the acting agent from taking action. The acting agent should also be able to specify the next acting agent. To model this, we used a token that the acting agent can pass on to the next agent. Only the agent with the token  is allowed to participate.

%\extend{What is the future of epistemic planning?}
%\todo{
%There are multiple ways this research could be used in the future, in the real world. One example is in autonomous driving. Two cars are standing across from each other on a bridge, only one car can pass. This problem could be solved with tokens.}

%\extend{Why is this research relevant?}
%Autonomous driving, zusammenbrechen der kommunikation
%später dann auf Anwendung eingehen,
%Beispiel mit vier autos an einer Kreuzung, brauchen token

%``Many applications, such as robotic warehouses, must coordinate a large number of agents simultaneously to carry out their specific tasks.'' This problem is usually described as the multi-agent path finding problem.

%The thought of researching if a different order solves some problems is also done in multi agent path finding problems. Here, the problem gets more complex the more agents there are and it is very similar to the DEL approach.

This thesis is structured as follows:
In section 2, we are going to give a brief overview of the related work to this thesis and highlight how this thesis is built on that work. In section 3 we will introduce the formal framework, dynamic epistemic logic (DEL) with modeling beliefs, states and actions. This logic is explained using a specific example, introduced in the beginning. In Section 4, we are going to formally introduce tokens to an existing planning problem and show how this approach solves infinite executions and deadlocks. In Section 5 we have the Conclusion of this thesis and the future work still nedded to be done.


text:
\subsection{Episode 32: Difficulty level Spoopy}
\DndDropCapLine{M}onkeh is trying to meditate, there are things that need to be done! He keeps talking about Ki that he needs to recharge, something about the center of the universe. I try and kick him into action. ``Get to work Monkeh''\medskip
Myron clearly the hero, who is on to continue to save the world, “Exmeh seems super interested. The new strat and tat of shoot first talk about it later seems to work well. The skeletons are not attacking us this time. Looting obviously takes place. I get a cape made from bed sheets, and offer another one to Riphard. He goes one further and wears it over his head, looking like a spoooooky ghost. Spooky ghost is our new point man.\medskip
Riphard gives the good old spooky call to what is a fucking ginormous monster!! Exmeh runs off to get the lazy monkeh. Delilah seems to be back into the mix again, thank god she has sorted things out with dwarf chops. Dwarfy malorfy farts and the sheet flies off, blowing his cover entirely.\medskip
Exmeh gives her monkeh a very strong telling off. Running back in time to don a gasmark and be ready for action. The new human tower formation still needs some more work, but it is great to see us working together in new and great ways. We fight the monstrosity in the door way. We make a pile of bodies in the door to keep the monster in place, while that bloody monkeh just sleeps! Myron seems to be using his shotgun to climb and blast the beast to pieces., what a great guy. I must help Exmeh out, he would make a valuable addition to the family. Luckily we survive, and the adventure continues.\medskip
As mother said, we go south, we ransack another apprentices rooms. I pocket as much as possible, including work on the teleportation circle.\medskip
Exmeh goes back and attaches monkeh to Stanri, but the pathetic robot can’t shift him. The stubborn monkey finally moves on. Myron has a good plan of removing the naughty monkehs testicles, should stop the need for us to beat the monkeh so often.\medskip
We keep investigating, although I’m sure Riphard should be in front for the scarem harem tactic to work properly. We are totally bamboozled when the massive doors ahead of us opens to reveal yet another massive monster! This place is full of at least 5 of them.\medskip
Myron gets shot and hooked by the giant beasts fishing rod cross bow thing! We get round to the killing bit a lot sooner than normal, thanks in part to the monkeh actually being there for a change. Bad luck monkeh gets set on fire. Things look grim, as I am impaled at one end of the room by the beasts awful flesh bow. Myron slides under the beast and blows its testes off as the rest of the party come to my aid. Maybe they will come together and be a good team one day. Disgusting monkey steals the beasts flesh bow.\medskip
Stanri starts flashing in sequence, exmeh has to debug the robot. Myron goes to report to the snake people that the monsters are all dead. I write up the pile of unattended bones as a 4031, dammit people should know better than to leave the bones lying around everywhere.\medskip
I run after exmeh as she takes us to the teleport circle, this is bad, I have seen Exmehs experiments blow up before and it is definitely in violation of almost all the codes I know. I hope that Stanri doesn’t takes the entire tower out.\medskip
Myron makes a new friend in the form of a snake that cuddles up to him. Its to be expected he did trade them all the monsters heads.\medskip
We reboot the teleportation circle, in what has to be one of the most painful fashions possible. It zaps me and a ginormous beast back into the circle. Sweet baby jesus she has created a monster! She transfers the brain of old stanri into new STANRI. The thing is just as idiotic as the old one, but hopefully will be a hell of a lot more useful.\medskip
Myron gives us a great inspirational talk, when we ride in on bear. He then goes off for some late night snake action, while monkeh tries to get into the good books STANRI.\medskip
We take a nights rest, and descend into the darkness. The light is much less functional down here, this is gonna make things hard. I seem to be super staticy now, along with a disturbing glow from my eyes that makes it really easy to see my nose.\medskip
Myron seems unchanged as he runs off down a corridor, sometimes he really does remind me of Gary.\medskip
We find sets of skeletons all over the shop down here. I think it is disturbing our monkeh.\medskip
Which was interesting until we see the central garden, with a cube in the middle. The gorgeous garden, that surrounds it is also hemmed in by force fields. The garden must be on the next level down, we must find a way to get to it.\medskip
There is some next level scary shit down here, the group has gone off to activate the right pressure plates. The group has split up to get all the plates but it’s starting to freak with my senses somewhat.\medskip
Myron gets to the second window around the same time the rest of the group returns. Just as I’m about to tell them how they shouldn’t have left him, the dark shape forms behind him. I scream through my mind at him, but to no avail he is far away and possible an idiot. There is nothing else to do but to hurry to his aid, and hope we can arrive in time.\medskip
As I get closer I can see spectral blue shapes with skeletons inside them, the dead are risen. This is as bad as that shit Alatar was into, we need to stop whatever the fuck it is asap. The Monkeh engages with the beast, but before the rest of us can get to it, it swoops through all of us.\medskip
First things first, skeletons must fall, which is proving difficult for everyone. Shit is going on, the skeletons won’t die, and we have heard a blood curdling scream from the other end of the corridor from Riphard.\medskip
The STANRI machine, eats one of the skeletons. While diagnosing Myron with ssssyphhhiliissss. The bear is truly wondrous, and scary. Riphard bounces round the corner and blasts the skeletons too pieces. Nice to see those guns seeing so much action, no wonder the church is so feared across the continent. Haven’t seen the massive cloud beast for a while….\medskip
Vu Dong whips out Pilchs sword from STANRIs back back, and I am furious! How dare he steal Fishys sword! BUT when I see him in action he is like a monkeh possessed, maybe part of Fishy does live on in him… we smash the final skeletons, but as we peer out across the overgrown garden, we see the smoke moonster at the forcefield window again.\medskip
https://www.youtube.com/watch?v=f7QzxYAjgNc\medskip