\begin{section}{Introduction}

  % §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§

  \begin{frame}
    Two Rust crates have been developed to model, analyze and design Reaction Systems.

    \vspace{1em}

    \begin{itemize}
    \item ReactionSystems
    \item ReactionSystemsGUI
    \end{itemize}

    \vspace{1em}

    ReactionSystemsGUI implements a custom visual language using the libraries \(\texttt{egui}\) and \(\texttt{egui\_node\_graph2}\).

    \vspace{1em}

    A web version is also provided that runs locally using WebAssembly.

    % A CLI is implemented in ReactionSystems too
  \end{frame}

  % §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§

  \begin{frame}
    \begin{figure}[h]
      \includegraphics[width=0.9\textwidth]{figures/instructions_medical.png}
    \end{figure}
    \begin{figure}[h]
      \includegraphics[width=0.9\textwidth]{figures/output_medical.png}
    \end{figure}
  \end{frame}
  % §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
\end{section}

% ==============================================================================

\begin{section}{Design}
  % §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
  \begin{frame}
    The libraries are more than 30k lines of code, organized in workspaces that allow easy development; the GUI has 29 types and more than 70 node operations.

    \begin{figure}[!h]
      \centering
      \scalebox{0.55}{
        \begin{tikzpicture}[
          place/.style={rectangle,draw=blue!50,fill=blue!20,thick},
          >=Stealth, thick, every node/.style={font=\sffamily}]

          \node[place] (analysis)          at (0,0.1)  {analysis};
          \node[place] (grammar)           at (3,-2)  {grammar};
          \node[place] (grammarseparated) at (-3,-2) {grammar\_separated};
          \node[place] (execution)         at (0,-1)  {execution};
          \node[place] (bisimilarity)      at (-3,-1) {bisimilarity};
          \node[place] (assert)            at (0,-2)  {assert};
          \node[place] (rsprocess)         at (0,-3)  {rsprocess};

          \draw[->]              (rsprocess) -- (assert);
          \draw[->]              (rsprocess) -- (grammarseparated);
          \draw[->,bend right=35](rsprocess) to[bend right=55] (execution);
          \draw[->]              (rsprocess) -- (grammar);
          \draw[->,bend right=32](rsprocess) to[bend right=57] (analysis);

          \draw[->]              (assert) -- (execution);
          \draw[->]              (assert) -- (grammarseparated);
          \draw[->]              (assert) -- (grammar);

          \draw[->]              (execution) -- (analysis);
          \draw[->]              (execution) -- (grammarseparated);
          \draw[->]              (execution) -- (grammar);

          \draw[->]              (bisimilarity) -- (execution);

          \draw[->]              (grammar) to[bend right=10] (analysis);
        \end{tikzpicture}
      }
      \scalebox{0.55}{
        \begin{tikzpicture}[scale=0.8, every node/.style={scale=0.8},
          place/.style={rectangle,draw=blue!50,fill=blue!20,thick},
          >=Stealth, thick, every node/.style={font=\sffamily}]

          \node[place] (set)     at (0,3)    {Set};
          \node[place] (reaction)at (4,3)    {Reaction};
          \node[place] (choices) at (8,3)    {Choices};
          \node[place] (label)   at (-2,1.5) {Label};
          \node[place] (env)     at (2,1.5)  {Environment};
          \node[place] (process) at (6,1.5)  {Process};
          \node[place] (system)  at (4,0)    {System};
          \node[place] (graph)   at (0,0)    {Graph};

          % Set
          \draw[->]              (set) -- (reaction);
          \draw[->,bend left=18] (set) to (choices);
          \draw[->,bend right=25](set) to (label);
          \draw[->]              (set) -- (graph);
          \draw[->,bend right=35,looseness=1.1] (set) to (system);
          \draw[->,bend right=12](set) to (env);

          % Label -> Graph
          \draw[->] (label) -- (graph);

          % Reaction
          \draw[->,bend left=12]  (reaction) to (process);
          \draw[->,bend right=12] (reaction) to (env);
          \draw[->,bend left=16]  (reaction) to (system);

          % Process
          \draw[->]               (process) -- (env);
          \draw[->]               (process) -- (system);
          \draw[->,bend right=18] (process) to (choices);

          \draw[->] (choices) to [bend left=2] (env);
          \draw[->] (choices.south) to [bend left=25] (system.east);
          \draw[->]               (env) -- (system);
          \draw[<->,bend left=15] (system) to (graph);
        \end{tikzpicture}
      }
    \end{figure}

    Grammars have been specified and developed for the RS structures using \(\texttt{lalrpop}\).
  \end{frame}

  % §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§

  \begin{frame}\frametitle{Reaction Systems}
    \begin{tblr}{colspec={X[b]X[h]}, measure = vbox}
      {\begin{minipage}{\dimexpr\linewidth-\tabcolsep}\raggedright%
        Reaction System (RS) is a successful computational framework inspired by biological systems.

        \vspace{1em}

        Key concepts: \textit{Facilitation} and \textit{Inhibition}

        \vspace{1em}

        Reaction: \((R, I, P)\)

        Reaction System: \(\mathcal{A} = (S, A)\)
      \end{minipage}} & {\captionsetup[figure]{font=tiny}\begin{figure}
        \includegraphics[clip, trim=20mm 110mm 85mm 40mm, width=0.8\linewidth, ]{figures/Molecular_Biology.pdf}
        \caption{Principle of Positive and Negative Regulation\cite{Clark_Pazdernik_McGehee_2018}}
      \end{figure}} \\
    \end{tblr}

    % S is called the background set of A and its elements are called entities
    % A is a set of reactions
  \end{frame}

  % §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§

  \begin{frame}
    Three key properties:
    \begin{enumerate}[label= (\roman*)]
    \item no permanency: entities vanish unless sustained by a reaction;
    \item no counting: the exact quantity of each entity is irrelevant;
    \item threshold nature of resources: if an entity is present, it is present for all possible reactions.
    \end{enumerate}
  \end{frame}

  % §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§

  \begin{frame}\frametitle{Interactive Process}
    The behavior of a RS is formalized through the notion of an interactive process:

    \begin{center}
      \begin{tblr}{colspec={rll}, colsep=1pt}
        Context Sequence: & \(\gamma\) & \(= {\{ C_i \}}_{i \in [0,n]}\), \\
        Result Sequence: & \(\delta\) & {\(= {\{ D_i \}}_{i \in [0, n]}\) with \text{\tikz[baseline={(char.base)}]{
    \node[anchor=base] (char) {\(D_{i+1} := res_A(D_i \cup C_i)\)};
    \draw[thick,blue!50,decorate,decoration={coil,aspect=0,pre length=4pt,post length=0pt, amplitude=1pt}] (char.south west) to (char.south east);
}}}
      \end{tblr}
    \end{center}
    \begin{figure}[h]
      \def\svgwidth{0.7\linewidth}
      \import{figures}{reaction_system.pdf_tex}
    \end{figure}
    % A Reaction System is then modeled as a process, with a externally given
    % context, from which the result is calculated: given a set given from the
    % context, it is summed to the previous result and for each reaction that is
    % activated the products are then summed and are the next result
  \end{frame}

  % §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
  \begin{frame}\frametitle{SOS rules}
    \begin{tblr}{colspec={Q[c,m]Q[l,m]}}
      {\begin{bnf}(relation-sym-map = % chktex 36
        {
          {::=} = {\ensuremath{\Coloneqq}},
          {->} = {},
          {:in:} = {\ensuremath{\subseteq}},
        },)
        $P$ : ::= % chktex 26
        | [$M$] : % chktex 26
        ;; % chktex 26
        $M$ : ::= % chktex 26
        | $(R, I, P)$ : % chktex 26
        | $D$ : % chktex 26
        | $K$ : % chktex 26
        | $M \vert M$ : % chktex 26
        ;; % chktex 26
        $K$ : ::= % chktex 26
        | \textbf{$0$} : % chktex 26
        | $X$ : % chktex 26
        | $C.K$ : % chktex 26
        | $K + K$ : % chktex 26
        | $\texttt{rec} X . K$ : % chktex 26
      \end{bnf}} & {Mutual Exclusion of 2 looping processes:\\
      \vspace{1em}
      {\tt Environment: [\\
      \quad k1 = (\{\}.k1 + \{act\_1\}.k1),\\
      \quad k2 = (\{\}.k2 + \{act\_2\}.k2)\\
      ]\\
      Initial Entities: \{out\_1, out\_2\}\\
      Context: [k1, k2]\\
      Reactions: (}\(\ldots\){\tt)}}\\ % chktex 9
    \end{tblr}
    % The behavior of a RS could be defined as a discrete time interactive
    % process: a finite context sequence describes the entities provided by the
    % environment at each step, the current state is determined by the union of
    % the entities coming from the environment with those produced from the
    % previous step and the state sequence is determined by applying all and
    % only the enabled reactions to the set of entities available in the current
    % state

    % (R, I, P) is a reaction, D is a set of entities (a reaction that is always
    % enabled), | (pipe) is the parallel composition

    % 0 is the nil context written as nill, X is a process variable, C is a set
    % of entities, + is non deterministic choice, rec is the recursive operator

    % operational semantics follow the definitions
  \end{frame}

  % §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§

  \begin{frame}{Graphs}
    To explore the structure of RSs, methods are provided to create and manipulate graphs.

    \begin{tblr}{colspec={Q[l,b]Q[l,b]},width=\linewidth}
      {\includegraphics[scale=0.16]{figures/graph_instructions.png}} & {
                                                                       Domain specific languages have been\\developed for:
      \begin{itemize}
      \item[$-$] specifying labels of nodes \& edges,
      \item[$-$] specifying color of nodes \& edges,
      \item[$-$] grouping of nodes,
      \item[$-$] relabeling of edges.
      \end{itemize}} \\
    \end{tblr}
  \end{frame}

  % §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§

  \begin{frame}
    \begin{figure}[h]
      \includegraphics[width=0.95\textwidth]{figures/lock_instructions.png}
    \end{figure}

    \begin{figure}[h]
      \includegraphics[scale=0.2]{figures/lock.pdf}
    \end{figure}
  \end{frame}

  % §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§

  \begin{frame}\frametitle{Positive Reaction Systems}
    Instead of considering the absence of an element, consider the presence of a negative element:

    \vspace{0.5em}

    Reaction: \((R, P)\)

    \vspace{0.5em}

    An equivalent Positive RS can be built for each RS.%
    \begin{figure}[h]
      \includegraphics[width=0.9\textwidth]{figures/to_positive_reactions.png}
    \end{figure}

    % To convert a list of reactions we first create a reaction for each product
    % in each reaction, then all reactions that have the same product are
    % converted together into their positive versions: One reaction is simply
    % the positive reactants and the negative inhibitors that produce the
    % positive product. The others are related to the absence of the product and
    % are created from the prohibiting set, where for every reactants or
    % inhibitor that does not allow the reaction to be enabled a reaction is
    % created.

    % The resulting reactions are then minimized, in order to reduce the
    % complexity of the traces, even tho the behavior is the same.
  \end{frame}

  % §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§

  \begin{frame}\frametitle{Slicing}
    Dynamic slicing is a technique that helps a user to debug a program by simplifying a partial execution trace.

    The goal is to highlight how a subset of the elements in a state were originated.

    \begin{minipage}{\textwidth}
      \centering
      \begin{minipage}[t][0.5\textheight][t]{0.75\textwidth}
        \begin{figure}
          \includegraphics[height=0.5\textheight]{figures/positive_slice.png}
        \end{figure}
      \end{minipage}%
      \begin{minipage}[t][0.5\textheight][t]{0.25\textwidth}
        \begin{figure}
          \includegraphics[scale=0.25]{figures/counting.pdf}
        \end{figure}
      \end{minipage}
    \end{minipage}
  \end{frame}

  % §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
  \begin{frame}\frametitle{Bisimulation}
    A common question given two RS processes is if they behave the same.
    Bisimulation is a binary relation between transition systems defined in therms of coinductive games, of fixed point theory and of logic.

    Two algorithms have been implemented: by Kanellakis and Smolka, and by Paige and Tarjan.

    \begin{figure}
      \includegraphics[scale=0.25]{figures/bisimilarity.png}
    \end{figure}
  \end{frame}

  % §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
  \begin{frame}\frametitle{Kanellakis and Smolka}
    The algorithm by Kanellakis and Smolka is based on the concept of splitter.

    \begin{tikzpicture}[baseline,
      place/.style={circle,draw=blue!50,fill=blue!20,thick},
      >=Stealth, thick, every node/.style={font=\sffamily}]

      \node[place] (s1) at (0,0) {\(s_1\)};
      \node[place] (s2) at (2,0) {\(s_2\)};
      \node[place] (s3) at (4,0) {\(s_3\)};
      \node[place] (s4) at (1,-2) {\(s_4\)};
      \node[place] (s5) at (3,-2) {\(s_5\)};

      \draw[->]    (s1) -- (s4);
      \draw[->]    (s2) -- (s5);

      \draw[->]    (s2) to[bend left=20] (s3);
      \draw[->]    (s3) to[bend left=20] (s2);

      \node[draw=black!80,fit=(s1) (s2) (s3),label=above right:$B_1$] {};
      \node[draw=black!80,fit=(s4) (s5),label=below right:$B_2$] {};
    \end{tikzpicture}%
    \hspace{0.3em}\(\to\)\hspace{0.3em}%
    \begin{tikzpicture}[baseline,
      place/.style={circle,draw=blue!50,fill=blue!20,thick},
      >=Stealth, thick, every node/.style={font=\sffamily}]

      \node[place] (s1) at (0,0) {\(s_1\)};
      \node[place] (s2) at (2,0) {\(s_2\)};
      \node[place] (s3) at (4,0) {\(s_3\)};
      \node[place] (s4) at (1,-2) {\(s_4\)};
      \node[place] (s5) at (3,-2) {\(s_5\)};

      \draw[->]    (s1) -- (s4);
      \draw[->]    (s2) -- (s5);

      \draw[->]    (s2) to[bend left=20] (s3);
      \draw[->]    (s3) to[bend left=20] (s2);

      \node[draw=blue!80,fit=(s1) (s2),label=above right:$B_1$] {};
      \node[draw=blue!80,fit=(s3),label=above:$B_3$] {};
      \node[draw=black!80,fit=(s4) (s5),label=below right:$B_2$] {};
    \end{tikzpicture}%
  \end{frame}

  % §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
  \begin{frame}\frametitle{Paige and Tarjan}
    The algorithm by Kanellakis and Smolka has time complexity \(O(n \cdot m)\).
    % where n is the number of states and m is the number of transitions
    By reducing to the coarsest stable partition problem, the complexity can be reduced to \(O(n \cdot \log(m))\), since three-way splitting can be performed in time proportional to the size of the smaller of the two blocks.
    % additional structures are needed for bookkeeping

    \vspace{1em}

    The algorithm is specified over systems with only one action, but other systems can be translated into equivalent ones.


    \begin{tblr}{width=\linewidth, colspec={X[r]Q[c]X[l]}}
      \begin{tikzpicture}[auto,
        place/.style={rectangle,draw=blue!50,fill=blue!20,thick,inner sep=0pt,
          minimum size=6mm},
        pre/.style={<-,shorten <=1pt,>={Stealth[round]},semithick},
        post/.style={->,shorten >=1pt,>={Stealth[round]},semithick}
        ]
        \node[place] (P1)               {\(P_1\)};
        \node[place] (P2) [right=of P1] {\(P_2\)}
        edge [pre] node [auto, swap] {\(\alpha_1\)} (P1);
        \node[place] (P3) [below=of P2] {\(P_3\)}
        edge [pre] node [auto] {\(\alpha_2\)} (P1)
        edge [pre] node [auto, swap] {\(\alpha_2\)} (P2);
      \end{tikzpicture}
      & \(\raisebox{3.5em}{\to}\) &
        \scalebox{0.30}{
        \begin{tikzpicture}[auto,
          place/.style={rectangle,draw=blue!50,fill=blue!20,thick,inner sep=0pt,
            minimum size=6mm},
          new/.style={circle,draw=blue!30,fill=blue!10,thick,inner sep=0pt,
            minimum size=6mm},
          pre/.style={<-,shorten <=1pt,>={Stealth[round]},semithick},
          post/.style={->,shorten >=1pt,>={Stealth[round]},semithick}
          ]
          \node[place] (P1) {\(P_1\)};
          \node[new] (p1e1) [above=of P1] {}
          edge [pre] (P1);
          \node[new] (p1e2) [above=of p1e1] {}
          edge [pre] (p1e1);
          \node[new] (p1e3) [above=of p1e2] {}
          edge [pre] (p1e2);

          \node[new] (a1) [right=of P1] {}
          edge [pre] (P1);
          \node[new] (a1e1) [above=of a1] {}
          edge [pre] (a1);

          \node[place] (P2) [right=of a1] {\(P_2\)}
          edge [pre] (a1);
          \node[new] (p2e1) [above=of P2] {}
          edge [pre] (P2);
          \node[new] (p2e2) [above=of p2e1] {}
          edge [pre] (p2e1);
          \node[new] (p2e3) [above=of p2e2] {}
          edge [pre] (p2e2);

          \node[new] (a2) [below=of P2] {}
          edge [pre] (P2);
          \node[new] (a2e1) [right=of a2] {}
          edge [pre] (a2);
          \node[new] (a2e2) [right=of a2e1] {}
          edge [pre] (a2e1);

          \node[new] (a3) [below=of a1] {}
          edge [pre] (P1);
          \node[new] (a3e1) [below=of a3] {}
          edge [pre] (a3);
          \node[new] (a3e2) [below=of a3e1] {}
          edge [pre] (a3e1);

          \node[place] (P3) [below=of a2] {\(P_3\)}
          edge [pre] (a2)
          edge [pre] (a3);
          \node[new] (p3e1) [right=of P3] {}
          edge [pre] (P3);
          \node[new] (p3e2) [right=of p3e1] {}
          edge [pre] (p3e1);
          \node[new] (p3e3) [right=of p3e2] {}
          edge [pre] (p3e2);
        \end{tikzpicture}
        }
    \end{tblr}
    % The operation is log-space
  \end{frame}

  % §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§

\end{section}

% ==============================================================================

\begin{section}{Conclusion}
  
  % §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§

  \begin{frame}\frametitle{Conclusion}
    Key contributions:
    \begin{itemize}
    \item[$\bullet$] New RS Modeling Platform that aids in analysis and design, implemented in Rust. Provided both a CLI and a GUI.%
    \item[$\bullet$] Comprehensive Feature Set: simulation of RS, bisimulation of graphs, trace slicing, graph generation with Dot, GraphML and SVG outputs, loop analysis, automated conversion between RS types.
    \item[$\bullet$] Improved performance and usability compared to previous software written in prolog and python.
    \end{itemize}
  \end{frame}

  % §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§

\end{section}
