diff --git a/background.tex b/background.tex index cb34779..4aaa490 100644 --- a/background.tex +++ b/background.tex @@ -41,12 +41,11 @@ We call \(\tau \defeq W_0, \ldots, W_n\) the state sequence, where \(W_i \defeq C_i \cup D_i\) for all \(i \in [0, n]\). \end{definition} - %% TODO figure 1 from 2001 a tour of reaction systems - % \begin{tikzpicture}[node distance=5mm] - % \node (dot) [terminal] {.}; - % \node (digit) [terminal,base right=of dot] {digit}; - % \node (E) [terminal,base right=of digit] {E}; - % \end{tikzpicture} + \begin{figure}[h] + \def\svgwidth{\linewidth} + \import{figures}{reaction_system.pdf_tex} + \caption{Interactive process of a reaction system.} + \end{figure} Note that \(C_i\) and \(D_i\) do not have to be disjointed. @@ -73,10 +72,10 @@ where reactions \(a\) cause the bits to be restrained in the next state if there is no operation, reactions \(b\) implement the increment operation by flipping the least significant zero to one, reactions \(c\) let the more significant bits remain, reactions \(d\) implements the decrement operation by flipping to one the bits when there is no one at a lower position, and reactions \(e\) let the more significant bits remain. - The complete RS \(\mathcal{B}_n\) is defined as follows: \(\mathcal{B}_n = \left(S_n, B_n\right)\) where \(S_n = \{p_0, p_1, \ldots, p_{n-1}\} \cup \{dec, inc\}\) and \(B_n = \{a_j, b_j, d_j | 0 \leq k < n\} \cup \{c_{j, k}, e_{j, k} | 0 \leq l < k < n\}\). + The complete RS \(\mathcal{B}_n\) is defined as follows: \(\mathcal{B}_n = \left(S_n, B_n\right)\) where\[S_n = \{p_0, p_1, \ldots, p_{n-1}\} \cup \{dec, inc\}\] and \[B_n = \{a_j, b_j, d_j | 0 \leq k < n\} \cup \{c_{j, k}, e_{j, k} | 0 \leq l < k < n\}\] To illustrate the system in action consider the sequence of contexts: - \(C_0 = \{p1, p3\}, C_1 = \emptyset, C_2 = \{inc\}, C_3 = \{inc\}, C_4 = \{dec\}, C_5 = \{dec, inc\}\). This gives the result sequence \(\delta = \emptyset.\{p1, p3\}.\{p1, p3\}.\{p0, p1, p3\}.\{p2, p3\}.\{p0, p1, p3\}.\emptyset\) and state sequence \(\tau = \{p1, p3\}.\{p1, p3\}.\{p1, p3, inc\}.\{p0, p1, p3, inc\}.\{p2, p3, dec\}.\{p0, p1, p3, dec, inc\}.\emptyset\) that in binary representation is \(\{1010\}.\{1010\}.\{1010\}.\{1011\}.\{1100\}.\{1011\}.\{0000\}\) by ignoring \(inc\) and \(dec\). + \(C_0 = \{p1, p3\},\\C_1 = \emptyset, C_2 = \{inc\}, C_3 = \{inc\}, C_4 = \{dec\}, C_5 = \{dec, inc\}\). This gives the result sequence \(\delta = \emptyset.\{p1, p3\}.\{p1, p3\}.\{p0, p1, p3\}.\{p2, p3\}.\{p0, p1, p3\}.\emptyset\) and state sequence\\\(\tau = \{p1, p3\}.\{p1, p3\}.\{p1, p3, inc\}.\{p0, p1, p3, inc\}.\{p2, p3, dec\}.\{p0, p1, p3, dec, inc\}.\emptyset\)\\that in binary representation is \(\{1010\}.\{1010\}.\{1010\}.\{1011\}.\{1100\}.\{1011\}.\{0000\}\) by ignoring \(inc\) and \(dec\). \end{subsection} \begin{subsection}{Simple loops} @@ -86,7 +85,7 @@ These loops are called \textit{lollipops}. - For example by providing the set \(\{inc\}\) as the context at each step of the system from Example\ \ref{binary_counter}, we obtain the loop: \(\{p1, p3\}.\{p0, p1, p3\}.\{p3, p2\}.\{p0, p3, p2\}.\{p1, p3, p2\}.\{p0, p1, p3, p2\}.\{\}.\{p0\}.\{p1\}.\{p0, p1\}.\{p2\}.\{p0, p2\}.\{p1, p2\}.\{p0, p1, p2\}.\{p3\}.\{p0, p3\}\). + For example by providing the set \(\{inc\}\) as the context at each step of the system from Example\ \ref{binary_counter}, we obtain the loop: \(\{p1, p3\}.\{p0, p1, p3\}.\{p2, p3\}.\{p0, p2, p3\}.\{p1, p2, p3\}.\\\{p0, p1, p2, p3\}.\{\}.\{p0\}.\{p1\}.\{p0, p1\}.\{p2\}.\{p0, p2\}.\{p1, p2\}.\{p0, p1, p2\}.\{p3\}.\{p0, p3\}\). \end{subsection} \end{section} @@ -117,7 +116,7 @@ $K$ : ::= % chktex 26 | \textbf{$0$} : nil context % chktex 26 | $X$ : process variable % chktex 26 - | $C.X$ : set of entities followed by context % chktex 26 + | $C.X$ : {set of entities\\followed by context} % chktex 26 | $K + K$ : non deterministic choice % chktex 26 | $\texttt{rec} X . K$ : recursive operator % chktex 26 ;; % chktex 26 @@ -324,7 +323,7 @@ \end{enumerate} \end{itemize} - \(TS_1\) and \(TS_2\) are bisimulation-equivalent (bisimilar), denoted \(TS_1 ~ TS_2\), if there exists a bisimulation \(\mathcal{R}\) for \((TS_1, TS_2)\). + \(TS_1\) and \(TS_2\) are bisimulation-equivalent (bisimilar), denoted \(TS_1 \sim TS_2\), if there exists a bisimulation \(\mathcal{R}\) for \((TS_1, TS_2)\). \end{definition} Where \(Post(s)\) is the set of successors of \(s\) defined as @@ -427,7 +426,7 @@ When applied to a finite labeled transition system with \(n\) states and \(m\) transitions, the algorithm of Kanellakis and Smolka computes the partition corresponding to bisimilarity in time \(O(n \cdot m)\). \end{theorem} - Proof of correctness relies on the fact that when \(changed\) is false, there is no splitter for any of the blocks in \(\pi\). Moreover, if we denote by \(\pi_i\) the partition after the \(i\)-iteration of the main loop, we have \(~ \subseteq ~_i \subseteq \pi_i\). Thus the algorithm terminates with \(\pi = ~\). + Proof of correctness relies on the fact that when \(changed\) is false, there is no splitter for any of the blocks in \(\pi\). Moreover, if we denote by \(\pi_i\) the partition after the \(i\)-iteration of the main loop, we have \(\sim \subseteq \sim_i \subseteq \pi_i\). Thus the algorithm terminates with \(\pi = \sim\). \end{paragraph} diff --git a/conclusion.tex b/conclusion.tex index cfaa172..aa5d091 100644 --- a/conclusion.tex +++ b/conclusion.tex @@ -1,3 +1,3 @@ \begin{chapter}{Conclusion} - + \end{chapter} diff --git a/design.tex b/design.tex index 824e7d2..3c0e3bd 100644 --- a/design.tex +++ b/design.tex @@ -1,10 +1,12 @@ \begin{chapter}{Design} - Two sub-problems where identified during the design: simulating the behavior of Reaction Systems, RS processes and other operations on LTS, and interacting with the user in a intuitive manner. The programming language chosen was \href{https://rust-lang.org/}{Rust}, since it offered good performance and ease of development. + Two sub-problems where identified during the design: simulating the behavior of Reaction Systems, RS processes and other operations on LTS, and interacting with the user in a intuitive manner. The programming language chosen was Rust\cite{rust_2025}, since it offered good performance and ease of development. Two Git repositories are provided: \href{https://github.com/elvisrossi/ReactionSystems}{github.com/elvisrossi/ReactionSystems} and \href{https://github.com/elvisrossi/ReactionSystemsGUI}{github.com/elvisrossi/ReactionSystemsGUI}. The ReactionSystems project follows a modular architecture and clear design principles to mirror the theoretical model; it implements procedures over RS as pure rust functions and is structured as a library. It also provides a crude Command Line Interface for some of the functions provided. The code is organized in workspaces in order to reduce compilation time and aid code reuse. - In the second Git repository a native and web application is implemented in Rust and in \href{https://webassembly.org/}{webassembly} generated from Rust code. The web application consists of only static files and as such may be served by a simple HTTP server. + In the second Git repository a native and web application is implemented in Rust and in webassembly\cite{WebAssemblyCoreSpecification2} generated from Rust code. The web application consists of only static files and as such may be served by a simple HTTP server. + + In the signature of the functions, types will be displayed in teletype font. The decorator \({}^{?}\) will be used for both option types and for result types without distinction. \begin{section}{ReactionSystems} The design is structured to faithfully implement the reaction system formalism while remaining flexible. @@ -12,7 +14,7 @@ Since the language Rust supports object-oriented programming via traits, but lacks generic inheritance, the design of the basic building blocks of RSs are designed around this limitation. Usually a basic trait is provided for each of them and an extension of the trait is implemented for all structures that implement the basic trait. - Since it is not practical for a user to specify the structures in Rust, a syntax for the basic structures has been specified. This syntax tries to remain as much as possible compatible with ones from previous software. To develop the parser, \href{https://github.com/lalrpop/lalrpop}{LALRPOP} was chosen as the parser generator framework. LALRPOP code is transpiled to Rust code via macros and then compiled to machine code. + Since it is not practical for a user to specify the structures in Rust, a syntax for the basic structures has been specified. This syntax tries to remain as much as possible compatible with ones from previous software. To develop the parser, LALRPOP\cite{Burgener2025} was chosen as the parser generator framework. LALRPOP code is transpiled to Rust code via macros and then compiled to machine code. \begin{figure}[!h] \centering @@ -98,7 +100,7 @@ \begin{minipage}{\textwidth} \centering - \begin{minipage}{.48\textwidth} + \begin{minipage}[b][][b]{.38\textwidth} \centering \begin{bnf}(relation-sym-map = % chktex 36 { @@ -108,19 +110,21 @@ },) $Set$ : ::= % chktex 26 | $\texttt{\{} S \texttt{\}}$ : % chktex 26 - | $\texttt{\{} \texttt{\}}$ : % chktex 26 ;; % chktex 26 $S$ : ::= % chktex 26 | $s\ \texttt{,}\ S$ : % chktex 26 | $s$ : % chktex 26 + | $\epsilon$ : % chktex 26 ;; % chktex 26 Where \\ & \(s\) -> is a string : % chktex 26 ;; % chktex 26 + $\epsilon$ -> is the empty string : % chktex 26 + ;; % chktex 26 \end{bnf} \captionsetup{type=table, name=\textbf{Syntax}} \caption{Syntax for Set}\label{bnf_set} \end{minipage}% - \begin{minipage}{.48\textwidth} + \begin{minipage}[b][][b]{.58\textwidth} \centering \begin{bnf}(relation-sym-map = % chktex 36 { @@ -128,13 +132,13 @@ {->} = {}, {:in:} = {\ensuremath{\in}}, },) - $PositiveSet$ : ::= % chktex 26 + {\small $PositiveSet$} : ::= % chktex 26 | $\texttt{\{} S \texttt{\}}$ : % chktex 26 - | $\texttt{\{} \texttt{\}}$ : % chktex 26 ;; % chktex 26 $S$ : ::= % chktex 26 | $\mathit{state}\ s\ \texttt{,}\ S$ : % chktex 26 | $\mathit{state}\ s$ : % chktex 26 + | $\epsilon$ : % chktex 26 ;; % chktex 26 $state$ : ::= % chktex 26 | $\texttt{+}$ : % chktex 26 @@ -142,6 +146,8 @@ ;; % chktex 26 Where \\ & \(s\) -> is a string : % chktex 26 ;; % chktex 26 + $\epsilon$ -> is the empty string : % chktex 26 + ;; % chktex 26 \end{bnf} \captionsetup{type=table, name=\textbf{Syntax}} \caption{Syntax for Positive Set}\label{bnf_positive_set} @@ -167,7 +173,7 @@ \begin{minipage}{\textwidth} \centering - \begin{minipage}{.48\textwidth} + \begin{minipage}{\textwidth} \centering \begin{bnf} (relation = {::=|:in:|->}, comment = {==}, @@ -186,9 +192,9 @@ \end{bnf} \captionsetup{type=table, name=\textbf{Syntax}} \caption{Syntax for Reaction}\label{bnf_reaction} - \end{minipage}\vspace{1em} + \end{minipage}\vspace{2em} - \begin{minipage}{.48\textwidth} + \begin{minipage}{\textwidth} \centering \begin{bnf} (relation = {::=|:in:|->}, comment = {==}, @@ -221,7 +227,7 @@ \end{itemize} \begin{minipage}{\textwidth} - \begin{minipage}{.48\textwidth} + \begin{minipage}[b][][b]{.48\textwidth} \begin{bnf} (relation = {::=|:in:|->}, comment = {==}, relation-sym-map = % chktex 36 @@ -258,7 +264,7 @@ \captionsetup{type=table, name=\textbf{Syntax}} \caption{Syntax for Process}\label{bnf_process} \end{minipage} - \begin{minipage}{.48\textwidth} + \begin{minipage}[b][][b]{.48\textwidth} \begin{bnf} (relation = {::=|:in:|->}, comment = {==}, relation-sym-map = % chktex 36 @@ -316,8 +322,19 @@ \item \(\texttt{unfold}(a, \mathit{context}: \texttt{process}, \mathit{s}: \texttt{set}) \to \texttt{choices}^{?}\), which returns the list of choices for the context, given the process definitions environment and is used to generate the next systems with the SOS rules. \end{itemize} - Some methods are automatically implemented for all \(\texttt{BasicEnvironment}\): \(\texttt{lollipops\_decomposed}\), \(\texttt{lollipops\_prefix\_len\_loop\_decomposed}\), \(\texttt{lollipops\_only\_loop\_decomposed}\), \(\texttt{lollipops\_decomposed\_named}\), \(\texttt{lollipops\_prefix\_len\_loop\_decomposed\_named}\), and \(\texttt{lollipops\_only\_loop\_decomposed\_named}\). - They all try to find a loop and return some information about the found loop. The \(\texttt{\_named}\) variants require a variable symbol for which in the environment there is an association to a process with the form \( X = Q.\texttt{rec}(X)\), where \(Q\) is a set.\vspace{1em} + These methods are automatically implemented for all \(\texttt{BasicEnvironment}\): + \begin{itemize} + \item \(\texttt{lollipops\_decomposed}\), + \item \(\texttt{lollipops\_decomposed\_named}\), + \item \(\texttt{lollipops\_prefix\_len\_loop\_decomposed}\), + \item \(\texttt{lollipops\_prefix\_len\_loop\_decomposed\_named}\), + \item \(\texttt{lollipops\_only\_loop\_decomposed}\), + \item \(\texttt{lollipops\_only\_loop\_decomposed\_named}\). + \end{itemize} + They all try to find a loop and return some information about the found loop. The \(\texttt{\_named}\) variants require a variable symbol for which in the environment there is an association to a process with the form \( X = Q.\texttt{rec}(X) = Q.X\), where \(Q\) is a set and \(X\) is a variable name. The others instead finds all the symbols that satisfy the constraint and uses them all. + Function \(\texttt{lollipops\_decomposed}\) returns the trace of sets for the prefix and the trace of sets for the loop for each recursive variable.\\ + \(\texttt{lollipops\_prefix\_len\_loop\_decomposed}\) returns the length of the prefix and the trace of the loop for each recursive variable. + \(\texttt{lollipops\_only\_loop\_decomposed}\) returns the trace of the loop for each recursive variable.\vspace{1em} \begin{minipage}{\textwidth} \centering @@ -336,11 +353,14 @@ $E$ == ::= % chktex 26 | $ x = c \texttt{,} E $ == | $ x = c $ == + | $ \epsilon $ == ;; % chktex 26 Where \\ & \(c\) -> {is a process, see\ \ref{bnf_process}} == ;; % chktex 26 \(x\) -> is a variable name == ;; % chktex 26 + \(\epsilon\) -> is the empty string == + ;; % chktex 26 \end{bnf} \captionsetup{type=table, name=\textbf{Syntax}} \caption{Syntax for Environment}\label{bnf_environment} @@ -361,11 +381,14 @@ $E$ == ::= % chktex 26 | $ x = pc \texttt{,} E $ == | $ x = pc $ == + | $ \epsilon $ == ;; % chktex 26 Where \\ & \(pc\) -> {is a positive process, see\ \ref{bnf_positive_process}} == ;; % chktex 26 \(x\) -> is a variable name == ;; % chktex 26 + \(\epsilon\) -> is the empty string == + ;; % chktex 26 \end{bnf} \captionsetup{type=table, name=\textbf{Syntax}} \caption{Syntax for Positive Environment}\label{bnf_positive_environment} @@ -374,12 +397,12 @@ \end{subsection} - \begin{subsection}{System} + \begin{subsection}{System}\label{design_system} The basic interface for systems is only the following methods: \begin{itemize} - \item \(\texttt{to\_transitions\_iterator}(sys) \to \texttt{iterator over (label, system)}\) - \item \(\texttt{to\_slicing\_iterator}(sys) \to \texttt{iterator over (label, system)}\) + \item \(\texttt{to\_transitions\_iterator}(sys) \to \texttt{iterator}\text{ that yields }\texttt{(label, system)}\) + \item \(\texttt{to\_slicing\_iterator}(sys) \to \texttt{iterator}\text{ that yields }\\\hspace*{0pt}\hfill \texttt{(set, set, [int], system)}\) \item \(\texttt{context\_elements}(sys) \to \texttt{set}\) \item \(\texttt{products\_elements}(sys) \to \texttt{set}\) \end{itemize} @@ -387,7 +410,7 @@ The method \(\texttt{to\_transitions\_iterator}\) should return an iterator over all the possible evaluations of the system. Likewise \(\texttt{to\_slicing\_iterator}\) should return an iterator over the same outgoing edges, but with information that support the creation of a trace to be used for slicing. The two methods \(\texttt{context\_elements}\) and \(\texttt{products\_elements}\) should return the set of entities that are related to the context and the one related to the reactions. Since it may be a computationally expensive calculation, the result is cached in the structures. - Since there may be errors when deciding what constitutes an element belonging to the context, methods are also present to override the default values. + The heuristic that decides which elements belong to the context and which belong to the reactions might give incorrect results, so methods are provided that override the calculated values. Other methods are implemented for all structures that satisfy the previous interface: @@ -395,9 +418,10 @@ \item \(\texttt{unfold}(\mathit{sys}) \to \texttt{choices}^{?}\), which, by calling the same method of the environment, returns the list of choices for the context; \item \(\texttt{run}(\mathit{sys}) \to \texttt{[system]}^{?}\), which computes the sequence of systems for the leftmost execution; \item \(\texttt{digraph}(\mathit{sys}) \to \texttt{graph}^{?}\), which computes the graph generated by the execution of the system; - \item \(\texttt{target}(\mathit{sys}) \to \texttt{(integer, set)}^{?}\), which returns the state in one of the terminal states and the number of steps to arrive at the last state; + \item \(\texttt{target}(\mathit{sys}) \to \texttt{(integer, set)}^{?}\), which returns the state in one of the terminal states and the number of steps to arrive at the last state;\label{function_target} \item \(\texttt{slice\_trace}(\mathit{sys}) \to \texttt{trace}^{?}\), which generates, similarly to \(\texttt{run}\), a trace appropriate to run slicing calculations over; - \item \(\texttt{lollipops}(\mathit{sys}) \to \texttt{[([set], [set])]}\), similar to the method \(\texttt{lollipops\_decomposed}\) provided by \(\texttt{environment}\). + \item \(\texttt{lollipops}(\mathit{sys}) \to \texttt{[([set], [set])]}\), similar to the method\\\(\texttt{lollipops\_decomposed}\) provided by \(\texttt{environment}\). + \item \(\texttt{lollipops\_only\_loop\_named}(\mathit{sys}, el: \texttt{element}) \to \texttt{[[set]]}^{?}\), similar to the method provided by \(\texttt{environment}\), returns the sequence of entities in the loop individuated by the variable name \(el\) in the environment. \end{itemize} \begin{minipage}{\textwidth} @@ -436,7 +460,7 @@ \end{subsection} \begin{subsection}{Label} - The label structure holds the information about how entities are used in the production of a system and are the labels on the edges of the graphs. Since the only use is to hold data, no meaningful method is required. + The label structure holds the information about how entities are used in the production of a system and are the labels on the edges of the graphs. Since the only use is to hold data, no meaningful method is required.\vspace{2em} \begin{minipage}{\textwidth} \centering @@ -481,7 +505,7 @@ \end{subsection} \begin{subsection}{Graph}\label{design_graph} - The project uses \href{https://github.com/petgraph/petgraph}{petgraph} as graph data structure library. \textit{petgraph} provides several graph types, but the only one used is \(\texttt{Graph}\), since it provided the best performance during testing. The library provides methods for converting the graph structures into \href{https://graphviz.org/doc/info/lang.html}{Dot Language} and \href{http://graphml.graphdrawing.org/}{GraphML File Format}. The Dot methods where found to be not powerful enough and where partially rewritten in the file \href{https://github.com/elvisrossi/ReactionSystems/blob/master/rsprocess/src/dot.rs}{dot.rs}. + The project uses petgraph\cite{Borgna2025} as graph data structure library. \textit{petgraph} provides several graph types, but the only one used is \(\texttt{Graph}\), since it provided the best performance during testing. The library has methods for converting the graph structures into {Dot Language}\cite{graphviz_2025} and {GraphML File Format}\cite{graphml_2025}. The Dot methods where found to be not powerful enough and where partially rewritten in the file \href{https://github.com/elvisrossi/ReactionSystems/blob/master/rsprocess/src/dot.rs}{dot.rs}. Custom formatting of the graphs was a key requirement, so domain specific languages are provided to customize the appearance of the generated formats. Four structures are provided: @@ -493,7 +517,7 @@ \item \(\texttt{EdgeColor}\), to specify the color of each edge. \end{itemize} - Follows the BNF for each of the languages: + Follows the BNF for each of the languages:\vspace{2em} \begin{minipage}{\textwidth} \centering @@ -767,6 +791,7 @@ | $\texttt{SystemContext}$ == | $\texttt{source}$ == source of edge | $\texttt{target}$ == target of edge + | $\texttt{label}$ == label of an edge | $\texttt{neightbours}$ == node's neighbours | $\texttt{system}$ == node's system ;; % chktex 26 @@ -778,7 +803,7 @@ | $\texttt{<}$ == less, set inclusion | $\texttt{<=}$ == less equal, set inclusion or equal | $\texttt{>}$ == greater, reverse set inclusion - | $\texttt{>=}$ == greater equal, reverse set inclusion or equal + | $\texttt{>=}$ == {greater equal,\\reverse set inclusion or equal} | $\texttt{=}\texttt{=}$ == | $\texttt{!=}$ == | $\texttt{+}$ == @@ -790,10 +815,10 @@ ;; % chktex 26 $binaryP$ == ::= % chktex 26 - | $\texttt{substr}$ == logical and - | $\texttt{min}$ == logical or % chktex 35 - | $\texttt{max}$ == logical xor % chktex 35 - | $\texttt{commonsubstr}$ == less or set inclusion + | $\texttt{substr}$ == + | $\texttt{min}$ == % chktex 35 + | $\texttt{max}$ == % chktex 35 + | $\texttt{commonsubstr}$ == ;; % chktex 26 $unaryS$ == ::= % chktex 26 @@ -808,6 +833,16 @@ \caption{Syntax for \(\texttt{Assert}\) (Continued)} \end{minipage}\vspace{1em} + Four different languages are provided as modules in the workspace \(\texttt{Assert}\): + \begin{itemize} + \item \(\texttt{relabel}\) + \item \(\texttt{grouping}\) + \item \(\texttt{positive\_relabel}\) + \item \(\texttt{positive\_grouping}\) + \end{itemize} + + \(\texttt{relabel}\) has, in its syntax, the first token equal to \(\texttt{label}\), has as special variables \(\texttt{label}\) and \(\texttt{edge}\) that function as input, with \(\texttt{edge.label} == \texttt{label}\). It's used for grouping labels before calculating bisimilarity. \(\texttt{grouping}\) has, in its syntax, the first token equal to \(\texttt{node}\), has as special variables \(\texttt{entities}\) and \(\texttt{node}\) that function as input, with \(\texttt{node.system.SystemEntities} == \texttt{entities}\). It's used for grouping nodes. \(\texttt{positive\_relabel}\) and \(\texttt{positive\_grouping}\) have as first token \(\texttt{label}\) and \(\texttt{node}\) respectively and behave in a similar manner compared to their respective functions over RS.% + The template language requires two structures to function relating to the input of the language: a type structure and a value structure. The trait \(\texttt{SpecialVariables}\) holds all the necessary functions that need to be implemented for the special variables to function. Finally the generic language can have the two functions \(\texttt{typecheck}\) and \(\texttt{execute}\) implemented. The language is very limited and is only designed for simple algorithms since there is no scoping. Typechecking consists in only asserting acceptable types for unary and binary functions, range declaration and for all return statements to return the same type. @@ -823,10 +858,10 @@ An experiment is a list of weights and a list of sets of same length. The sets are used as entities given in addition to the context entities when computing the RS.\ The resulting trace is then synthesized into relative frequencies. The methods offered by \(\texttt{Frequency}\) and \(\texttt{PositiveFrequency}\) are: \begin{itemize} - \item \(\texttt{naive\_frequency}(sys: \texttt{system}) \to \texttt{frequency}^{?}\), which computes the relative frequency of each entity in all traversed states, assuming the computation is finite; + \item \(\texttt{naive\_frequency}(sys: \texttt{system}) \to \texttt{frequency}^{?}\), which computes the relative frequency of each entity in all traversed states, assuming the computation is finite;\label{function_naive_frequency} \item \(\texttt{loop\_frequency}(sys: \texttt{system}, symbol: \texttt{IdType}) \to \texttt{frequency}\), which computes the relative frequency of each entity in each state of the encountered loop, assuming the system stabilizes in a loop; \item \(\texttt{limit\_frequency}(experiment: \texttt{[set]}, reactions: \texttt{[reaction]}, entities: \texttt{set}) \to \texttt{frequency}^{?}\), which computes the relative frequency of each entity in the states of the last loop by providing repeatedly the sets in the experiment until the system stabilizes in a loop; - \item \(\texttt{fast\_frequency}(experiment: \texttt{[set]}, reactions: \texttt{[reaction]}, entities: \texttt{set}, weights: \texttt{[int]}) \to \texttt{frequency}^{?}\), which computes the weighted relative frequency of each entity in any of the loops. + \item \(\texttt{fast\_frequency}(experiment: \texttt{[set]}, reactions: \texttt{[reaction]}, entities: \texttt{set},\\ weights: \texttt{[int]}) \to \texttt{frequency}^{?}\), which computes the weighted relative frequency of each entity in any of the loops. \end{itemize} \begin{minipage}{\textwidth} @@ -841,29 +876,134 @@ | $\texttt{Weights : } W \texttt{ Sets : } S$ == ;; % chktex 26 $W$ == ::= % chktex 26 - | $ i \texttt{, } W$ == + | $ i \texttt{, } W $ == + | $ i $ == | $ \epsilon $ == ;; % chktex 26 $S$ == ::= % chktex 26 - | $ s \texttt{, } S$ == + | $ s \texttt{, } S $ == + | $ s $ == | $ \epsilon $ == ;; % chktex 26 Where \\ & \(s\) -> is a sets of entities, see\ \ref{bnf_set} == ;; % chktex 26 \(i\) :in: $\mathbb{Z}$ == % chktex 26 ;; % chktex 26 + \(\epsilon\) -> is the empty string == % chktex 26 + ;; % chktex 26 \end{bnf} \captionsetup{type=table, name=\textbf{Syntax}} \caption{Syntax for Experiment} \end{minipage} \end{subsection} + + \begin{subsection}{Instructions} + The command line interface provided by the workspace \(\texttt{analysis}\) expects as input a path to a file with a RS and some instructions, reads the file, executes the instructions and returns the result in the forms specified. The syntax for specifying instructions is as follows:\vspace{1em} + + \begin{minipage}{\textwidth} + \begin{bnf}(relation-sym-map = % chktex 36 + { + {::=} = {\ensuremath{\Coloneqq}}, + {->} = {}, + {:in:} = {\ensuremath{\in}}, + }, + comment = {==}) + $Instructions$ == ::= % chktex 26 + | $System\ \mathit{Is}$ == + | $\texttt{Deserialize (} path \texttt{) } \mathit{Is}$ == % chktex 9 + ;; % chktex 26 + + $\mathit{Is}$ == ::= % chktex 26 + | $ I, \mathit{Is} $ == + | $ I $ == + | $ \epsilon $ == + ;; % chktex 26 + + Where \\ & \(\epsilon\) -> is the empty string == + ;; % chktex 26 + \end{bnf} + \captionsetup{type=table, name=\textbf{Syntax}} + \caption{Syntax for Instructions} + \end{minipage} + + \begin{minipage}{\textwidth} + \begin{bnf}(relation-sym-map = % chktex 36 + { + {::=} = {\ensuremath{\Coloneqq}}, + {->} = {}, + {:in:} = {\ensuremath{\in}}, + }, + comment = {==}) + + $I$ == ::= % chktex 26 + | $ \texttt{Stats > } so $ == + | $ \texttt{Target > } so $ == + | $ \texttt{Target ( Limit :} i \texttt{ ) > } so $ == % chktex 9 + | $ \texttt{Run > } so $ == + | $ \texttt{Run ( Limit :} i \texttt{ ) > } so $ == % chktex 9 + | $ \texttt{Loop (} el \texttt{) > } so $ == % chktex 9 + | $ \texttt{Frequency > } so $ == + | $ \texttt{LimitFrequency ("} path \texttt{") > } so $ == % chktex 9 chktex 18 + | $ \texttt{FastFrequency ("} path \texttt{") > } so $ == % chktex 9 chktex 18 + | $ \texttt{Digraph > } gso $ == + | $ \texttt{Digraph } group \texttt{ > } \mathit{gso} $ == + | $ \texttt{Bisimilarity ("} path \texttt{") relabel } relabel \texttt{ > } so $ == % chktex 9 chktex 18 + ;; % chktex 26 + + $\mathit{gso}$ == ::= % chktex 26 + | $g\ \texttt{\textbar}\ \mathit{gso}$ == + | $g$ == + ;; % chktex 26 + + $g$ == ::= % chktex 26 + | { $\texttt{Dot}$\\ $\texttt{\textbar}\ NodeDisplay$\\ $\texttt{\textbar}\ EdgeDisplay$\\ $\texttt{\textbar}\ NodeColor$\\ $\texttt{\textbar}\ EdgeColor$\\ $\texttt{>}\ so$ } == + | { $\texttt{GraphML}$\\ $\texttt{\textbar}\ NodeDisplay$\\ $\texttt{\textbar}\ EdgeDisplay$\\ $\texttt{>}\ so$ } == + | $\texttt{Serialize("} path \texttt{")}$ == % chktex 9 chktex 18 + ;; % chktex 26 + + $so$ == ::= % chktex 26 + | $\texttt{Print}; so$ == + | $\texttt{Print}$ == + | $\texttt{Save ("} path \texttt{")}; so$ == % chktex 9 chktex 18 + | $\texttt{Save ("} path \texttt{")}$ == % chktex 9 chktex 18 + ;; % chktex 26 + + Where \\ & \(path\) -> is a path to a file == + ;; % chktex 26 + \(NodeDisplay\) -> follows the syntax from\ \ref{bnf_node_display} == + ;; % chktex 26 + \(EdgeDisplay\) -> follows the syntax from\ \ref{bnf_edge_display} == + ;; % chktex 26 + \(NodeColor\) -> follows the syntax from\ \ref{bnf_node_color} == + ;; % chktex 26 + \(EdgeColor\) -> follows the syntax from\ \ref{bnf_edge_color} == + ;; % chktex 26 + \(group\) -> is a group function with syntax from\ \ref{bnf_assert} == + ;; % chktex 26 + \(relabel\) -> is a relabel function with syntax from\ \ref{bnf_assert} == + ;; % chktex 26 + \(i\) :in: $\mathbb{N}$ == % chktex 26 + ;; % chktex 26 + \(el\) -> is a string that symbolizes an element == + ;; % chktex 26 + \(path\) -> is a path to a file == + ;; % chktex 26 + \end{bnf} + \captionsetup{type=table, name=\textbf{Syntax}} + \ContinuedFloat{} + \caption{Syntax for Instructions (Continued)} + \end{minipage} + + The instruction \(\texttt{Stats}\) returns static information and statistics about the system. \(\texttt{Target}\) and \(\texttt{Run}\) return the results of the function with the same name defined in section\ \ref{function_target}. \(\texttt{Loop}\) returns the result of the function \(\texttt{lollipops\_only\_loop\_named}\) described in the same section. \(\texttt{Frequency}\) returns the results of \(\texttt{naive\_frequency}\) as described in section\ \ref{function_naive_frequency}. \(\texttt{LimitFrequency}\) and \(\texttt{FastFrequency}\) require a path to an experiment, with syntax described in\ \ref{experiment}, and they return the result of \(\texttt{limit\_frequency}\) and \(\texttt{fast\_frequency}\) respectively. \(\texttt{Digraph}\) may take a function \(group\) that groups together nodes that have the same output, described in section\ \ref{bisimilarity_design}. The graphs can be either saved as a Dot or GraphML file or serialized directly. \(\texttt{Bisimilarity}\) takes a path to another instruction file, whose instructions are ignored, and returns if the two systems are bisimilar. The results can be saved to a file or print to screen or both. + \end{subsection} \end{section} \begin{section}{ReactionSystemsGUI} During development of ReactionSystems, a need for a more intuitive interaction with the structures presented itself. Since the all the operations on the types where already limited and structured, a visual programming language was chosen as the best fit. - The library \href{https://github.com/trevyn/egui_node_graph2}{\(\texttt{egui\_node\_graph2}\)} was chosen since it offered customizability, performance and ease of programming. The library unfortunately lacked compatibility with the most recent version of \href{https://github.com/emilk/egui}{\(\texttt{egui}\)}, so it is included as a workspace and modified to fit better the need of the project. This way a couple of bugs present in the original code could be fixed. + The library {\(\texttt{egui\_node\_graph2}\)}\cite{egui_node_graph22024} was chosen since it offered customizability, performance and ease of programming. The library unfortunately lacked compatibility with the most recent version of {\(\texttt{egui}\)}\cite{Ernerfeldt2025}, so it is included as a workspace and modified to fit better the need of the project. + This way a couple of visual bugs present in the original code have also been fixed. \(\texttt{egui\_node\_graph2}\) is based on the library \(\texttt{egui}\), which is an immediate mode GUI. % chktex 13 It differentiate itself from retained mode GUIs by having all the elements specified at every frame; this eases programming at the expense of performance. The trade-off is favorable since most of the computation will be on the algorithms over RS and the number of elements of the UI will remain small in most cases. diff --git a/development.tex b/development.tex index b3c4f2c..39ce7ea 100644 --- a/development.tex +++ b/development.tex @@ -36,7 +36,7 @@ impl PrintableWithTranslator for Set { \end{subsection} \begin{subsection}{Set} - The structure \(\texttt{set}\), implemented in the file \href{https://github.com/elvisrossi/ReactionSystems/blob/master/rsprocess/src/set.rs}{set.rs}, is a key component for all functions in the library. It is realized as a \href{https://doc.rust-lang.org/std/collections/struct.BTreeSet.html}{binary tree set}. Binary trees were chosen instead of hash sets for various reasons: binary trees support hashing of the whole tree, hash sets do not; the penalty for retrieval of individual elements is offset by the performance gain for set operations like union or intersection. + The structure \(\texttt{set}\), implemented in the file \href{https://github.com/elvisrossi/ReactionSystems/blob/master/rsprocess/src/set.rs}{set.rs}, is a key component for all functions in the library. It is realized as a {binary tree set}\cite{btree_2025}. Binary trees were chosen instead of hash sets for various reasons: binary trees support hashing of the whole tree, hash sets do not; the penalty for retrieval of individual elements is offset by the performance gain for set operations like union or intersection. \end{subsection} \begin{subsection}{Reaction} @@ -44,17 +44,19 @@ impl PrintableWithTranslator for Set { \end{subsection} \begin{subsection}{Process, Choices and Environment} - Context processes, available in \href{https://github.com/elvisrossi/ReactionSystems/blob/master/rsprocess/src/process.rs}{process.rs}, have been implemented as trees. Each pointer to the next process is an \href{https://doc.rust-lang.org/std/sync/struct.Arc.html}{\(\texttt{Arc}\)} so that they may be used in concurrent applications, like ReactionSystemsGUI.\ There is no need for interior mutability, so no mutex or semaphore is used. The name of variables used to identify environment processes are converted like entities from strings to integers and they are handled by \(\texttt{Translator}\), since there no reason was found to distinguish them. + Context processes, available in \href{https://github.com/elvisrossi/ReactionSystems/blob/master/rsprocess/src/process.rs}{process.rs}, have been implemented as trees. Each pointer to the next process is an {\(\texttt{Arc}\)}\cite{arc_2025} so that they may be used in concurrent applications, like ReactionSystemsGUI.\ There is no need for interior mutability, so no mutex or semaphore is used. The name of variables used to identify environment processes are converted like entities from strings to integers and they are handled by \(\texttt{Translator}\), since there no reason was found to distinguish them. The structure \(\texttt{Choices}\) is available in \href{https://github.com/elvisrossi/ReactionSystems/blob/master/rsprocess/src/choices.rs}{choices.rs}; \(\texttt{Environment}\) is available in file \href{https://github.com/elvisrossi/ReactionSystems/blob/master/rsprocess/src/environment.rs}{environment.rs}. \(\texttt{Environment}\) has been implemented as a binary tree like sets, in order to be able to hash them; even tho no set operations are needed, the performance penalty is small enough. \end{subsection} - \begin{subsection}{System} + \begin{subsection}{System}\label{development_system} Systems are implemented in the file \href{https://github.com/elvisrossi/ReactionSystems/blob/master/rsprocess/src/system.rs}{system.rs}. Systems are composed by an environment, a set of initial entities, a process and a vector of reaction rules. Two other private fields are used: \(\texttt{context\_elements}\) and \(\texttt{products\_elements}\). They hold the set of entities that concern context and the ones that concert the products, such that their union is equal to all the entities available to the system and their intersection is the empty set. These two fields are not public since their computation may be particularly expensive, but is not needed for most of the calculations. So it would be wasteful to compute when creating the system and would be unwieldy to cache the result in every function that uses the results. The choice was to make \(\texttt{System}\) as a structure with interior mutability. This property is checked by the Rust compiler and forbids one from using the structure in hash maps or binary trees. But since we know that these two fields are completely determined by the other four, we ignore them when calculating the hash and assure the compiler of their stability in the file \href{https://github.com/elvisrossi/ReactionSystems/blob/master/clippy.toml}{clippy.toml}, where it is specified that both \(\texttt{System}\) and \(\texttt{PositiveSystem}\) are to be ignored. Since the automatic assignment to context or product element can be erroneous, nodes to overwrite these values are available in ReactionSystemsGUI.\ + + The two key functions \(\texttt{to\_transition\_iterator}\) and \(\texttt{to\_slicing\_iterator}\) specify that they return an iterator, a lazy structure with a \(\texttt{next}\) method for obtaining the following value. This is to allow for a more efficient implementation in cases where not all states are needed. \end{subsection} \begin{subsection}{Label} @@ -92,7 +94,7 @@ pub type PositiveSystemGraph = Graph; \end{minted} - in the file \href{https://github.com/elvisrossi/ReactionSystems/blob/master/rsprocess/src/graph.rs}{graph.rs}, where \(\texttt{Graph}\) is from the library \href{https://docs.rs/petgraph/latest/petgraph/graph/struct.Graph.html}{petgraph}. This was done to leverage the traits provided already by the external library. + in the file \href{https://github.com/elvisrossi/ReactionSystems/blob/master/rsprocess/src/graph.rs}{graph.rs}, where \(\texttt{Graph}\) is from the library {petgraph}\cite{Borgna2025}. This was done to leverage the traits provided already by the external library. \(\texttt{Graph}\texttt{}\) takes four generic parameters: \begin{itemize} \item Associated data \(N\) for nodes and \(E\) for edges, called weights. The associated data can be of arbitrary type; @@ -110,17 +112,11 @@ pub type PositiveSystemGraph = The four structures --- \(\texttt{NodeDisplay}\), \(\texttt{EdgeDisplay}\), \(\texttt{NodeColor}\), and \(\texttt{EdgeColor}\) --- all have the \(\texttt{generate}\) and \(\texttt{generate\_positive}\) methods, which convert the relative structure into an executable function that can be used when creating Dot or GraphML documents. No unified trait has been defined since the functions returned have different types and the use for this trait may be limited. \end{subsection} - \begin{subsection}{Tests} - During the development of the library some tests were developed in order to test behavior in the changing code. They can be run with \(\texttt{cargo test}\). Test coverage is not high, but is present in for pieces of code that might break more easily. Tests are usually present in a separate file as the structure declaration and are named ``*\_test.rs'', so that they might be easily recognized. - - In addition to automated tests, some example inputs are provided in the folder \href{https://github.com/elvisrossi/ReactionSystems/tree/master/testing}{{\tt testing}}. The extension \(\texttt{.system}\) symbolizes system and associated instructions; the extension \(\texttt{.experiment}\) symbolizes an experiment, see\ \ref{experiment}. - \end{subsection} - \begin{subsection}{Slicing Trace} Since traces are only lists of states, often no type associated with them is provided; some trace types are present in \href{https://github.com/elvisrossi/ReactionSystems/blob/master/rsprocess/src/trace.rs}{trace.rs}. - Of particular interest is the structure \(\texttt{SlicingTrace}\). + Of particular interest is the structure\\\(\texttt{SlicingTrace}\). Instead of using traits, it was more convenient to use generic type parameters for the slices structures. - For both RS and Positive RS the method \(\texttt{slice}\) faithfully implements the algorithm described in subsection\ \ref{slicing}. + For both RS and Positive RS the method \(\texttt{slice}\) faithfully implements the algorithm described in section\ \ref{slicing}. A new slice structure is returned because often the previous slice might get reused as input to other slicings. This occurs in a minor performance penalty if only one slice is requested. \end{subsection} @@ -229,7 +225,7 @@ struct CacheInternals { Nodes are organized in categories and can be added with right click of the mouse. The canvas can be zoomed and panned, helping the user organize the nodes. - An peculiar node is the ``String to SVG'' one. It takes a Dot file as string as an input and outputs an SVG value. The string is first parsed as an Dot file using the library \href{https://docs.rs/layout-rs/latest/layout/}{layout}, then the resulting graph is converted to a tree that represents an SVG.\ Then it is converted into string to be able to be parsed again by the library \href{https://docs.rs/resvg/latest/resvg/}{resvg}. Finally an image buffer is allocated and the tree is rendered on the pixel map. Since egui library is not optimized to display arbitrary images, the pixel map is then converted to texture so that it may be cached more easily. To save on space the texture is not serialized and is recomputed when needed. The result can be either displayed on screen or saved as a PNG image. + An peculiar node is the ``String to SVG'' one. It takes a Dot file as string as an input and outputs an SVG value. The string is first parsed as an Dot file using the library {layout}\cite{Rotem2025}, then the resulting graph is converted to a tree that represents an SVG.\ Then it is converted into string to be able to be parsed again by the library {resvg}\cite{Stampfl2025}. Finally an image buffer is allocated and the tree is rendered on the pixel map. Since egui library is not optimized to display arbitrary images, the pixel map is then converted to texture so that it may be cached more easily. To save on space the texture is not serialized and is recomputed when needed. The result can be either displayed on screen or saved as a PNG image. The code for the render of SVG files is implemented in \href{https://github.com/elvisrossi/ReactionSystemsGUI/blob/main/reaction_systems_gui/src/svg.rs}{svg.rs}. @@ -242,14 +238,14 @@ cargo build -p "reaction\_systems\_gui" --release --all-features --lib --target wasm32-unknown-unknown \end{minted} - that builds for the target wasm32. Then using \href{https://github.com/wasm-bindgen/wasm-bindgen}{wasm-bindgen} we create the appropriate bindings with the command + that builds for the target wasm32. Then using {wasm-bindgen}\cite{wasm-bindgen2025} we create the appropriate bindings with the command \begin{minted}{sh} wasm-bindgen "[..]/reaction\_systems\_gui.wasm" --out-dir docs --no-modules --no-typescript \end{minted} - As an additional step we optimize using \(\texttt{wasm-opt}\) from the library \href{https://github.com/WebAssembly/binaryen}{binaryen} with + As an additional step we optimize using \(\texttt{wasm-opt}\) from the library {binaryen}\cite{binaryen_2025} with \begin{minted}{sh} wasm-opt "[..]/reaction\_systems\_gui\_bg.wasm" -O2 --fast-math diff --git a/document.bib b/document.bib index f4ee8e7..8a408c9 100644 --- a/document.bib +++ b/document.bib @@ -60,3 +60,141 @@ month = 12, pages = {973–989} } + +@Online{rust_2025, + accessed = {2025-09-14}, + author = {The Rust teams}, + title = {Rust Programming Language}, + url = {https://rust-lang.org/} +} + +@report{WebAssemblyCoreSpecification2, + title = {{WebAssembly Core Specification}}, + version = {2.0}, + editor = {Rossberg, Andreas}, + date = {2025-09-14}, + institution = {{W3C}}, + url = {https://www.w3.org/TR/wasm-core-2/}, + langid = {english}, +} + +@software {Burgener2025, + author = {Daniel Burgener}, + title = {{lalrpop}: convenient LR(1) parser generator}, + url = {https://github.com/lalrpop/lalrpop}, + date = {2025-05-22}, + version = {0.22.2}, + license = {Apache-2.0 OR MIT}, +} + +@software {Borgna2025, + author = {Agustín Borgna}, + title = {{petgraph}: Graph data structure library. Provides + graph types and graph algorithms.}, + url = {https://github.com/petgraph/petgraph}, + date = {2025-09-30}, + version = {0.8.3}, + license = {MIT OR Apache-2.0}, +} + +@Online{graphviz_2025, + accessed = {2025-09-14}, + title = {Graphviz is open source graph visualization + software.}, + author = {Ellson, John}, + url = {https://graphviz.org/doc/info/lang.html}, +} + +@Online{graphml_2025, + accessed = {2025-09-14}, + title = {GraphML is a comprehensive and easy-to-use file + format for graphs.}, + author = {The GraphML Team}, + url = {http://graphml.graphdrawing.org/}, +} + +@software {egui_node_graph22024, + author = {trevyn}, + title = {{egui\_node\_graph2}: A helper library to create + interactive node graphs using egui}, + url = {https://github.com/trevyn/egui_node_graph2}, + date = {2024-11-03}, + version = {0.7.0}, + license = {MIT}, +} + +@software {Ernerfeldt2025, + author = {Emil Ernerfeldt}, + title = {{egui}: An easy-to-use immediate mode GUI that runs + on both web and native}, + url = {https://github.com/emilk/egui}, + date = {2025-11-13}, + version = {0.33.2}, + license = {MIT OR Apache-2.0}, +} + +@Online{btree_2025, + accessed = {2025-09-14}, + title = {An ordered set based on a B-Tree.}, + author = {The Rust teams}, + url = {https://doc.rust-lang.org/std/collections/struct.BTreeSet.html}, +} + +@Online{arc_2025, + accessed = {2025-09-14}, + title = {A thread-safe reference-counting pointer. ‘Arc’ + stands for ‘Atomically Reference Counted’.}, + author = {The Rust teams}, + url = {https://doc.rust-lang.org/std/sync/struct.Arc.html}, +} + +@software {Rotem2025, + author = {Nadav Rotem}, + title = {{layout-rs}: A graph visualization program}, + url = {https://github.com/nadavrot/layout}, + date = {2025-04-24}, + version = {0.1.3}, + license = {MIT}, +} + +@software {Stampfl2025, + author = {Laurenz Stampfl}, + title = {{resvg}: An SVG rendering library.}, + url = {https://github.com/linebender/resvg}, + date = {2025-04-17}, + version = {0.45.1}, + license = {Apache-2.0 OR MIT}, +} + +@software {wasm-bindgen2025, + author = {daxpedda}, + title = {{wasm-bindgen}: Easy support for interacting between + JS and Rust.}, + url = {https://github.com/wasm-bindgen/wasm-bindgen}, + date = {2025-10-27}, + version = {0.2.105}, + license = {MIT OR Apache-2.0}, +} + +@Software{binaryen_2025, + title = {{binaryen}: a compiler and toolchain infrastructure + library for WebAssembly, written in C++.}, + date = {2025-10-27}, + url = {https://github.com/WebAssembly/binaryen}, +} + +@Manual{manualperf_2025, + title = {perf(1) — Linux manual page}, + edition = {6.17-2}, + month = 11, + year = 2025, +} + +@software {Ochtman2025, + author = {Dirkjan Ochtman}, + title = {{flamegraph}: A simple cargo subcommand for generating flamegraphs, using inferno under the hood}, + url = {https://github.com/flamegraph-rs/flamegraph}, + date = {2025-11-07}, + version = {0.6.10}, + license = {MIT OR Apache-2.0}, +} diff --git a/document.pdf b/document.pdf index a072fa8..61228d7 100644 Binary files a/document.pdf and b/document.pdf differ diff --git a/document.tex b/document.tex index cf6f656..6d42194 100644 --- a/document.tex +++ b/document.tex @@ -11,13 +11,13 @@ \usepackage{fontspec} \directlua{ - luaotfload.add_fallback ("fallbacktest", + luaotfload.add_fallback ("fallbackscript", { "freeserif:mode=harf;script=dev2;color=000000;", }) } -\setmainfont{latinmodernroman}[RawFeature={fallback=fallbacktest}] +\setmainfont{latinmodernroman}[RawFeature={fallback=fallbackscript}] \usepackage[italian,main=english]{babel} %% language @@ -216,6 +216,8 @@ \input{validation} \input{conclusion} +\printbibliography% + \end{document} %% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - %% diff --git a/figures/bifurcated.pdf b/figures/bifurcated.pdf new file mode 100644 index 0000000..03cc1c4 Binary files /dev/null and b/figures/bifurcated.pdf differ diff --git a/figures/bifurcated.svg b/figures/bifurcated.svg new file mode 100644 index 0000000..8a6af5f --- /dev/null +++ b/figures/bifurcated.svg @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/figures/bifurcated_gui.png b/figures/bifurcated_gui.png new file mode 100644 index 0000000..5694919 Binary files /dev/null and b/figures/bifurcated_gui.png differ diff --git a/figures/flamegraph_mex10.pdf b/figures/flamegraph_mex10.pdf new file mode 100644 index 0000000..0dd8858 Binary files /dev/null and b/figures/flamegraph_mex10.pdf differ diff --git a/figures/flamegraph_mex10.svg b/figures/flamegraph_mex10.svg new file mode 100644 index 0000000..09fb951 --- /dev/null +++ b/figures/flamegraph_mex10.svg @@ -0,0 +1,491 @@ +Flame Graph Reset ZoomSearch [libc.so.6] (66,183,855 samples, 0.02%)core::ptr::drop_in_place<alloc::sync::Arc<rsprocess::set::Set>> (33,117,695 samples, 0.01%)<alloc::sync::Arc<T,A> as core::ops::drop::Drop>::drop (33,117,695 samples, 0.01%)<rsprocess::transitions::TransitionsIterator<rsprocess::set::Set,rsprocess::system::System,rsprocess::process::Process> as core::iter::traits::iterator::Iterator>::next (144,832,570 samples, 0.04%)[libc.so.6] (37,237,278 samples, 0.01%)<T as rsprocess::system::ExtensionsSystem>::digraph (227,622,188 samples, 0.07%)alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,NodeType>,alloc::collections::btree::node::marker::Edge>::right_kv (96,761,410 samples, 0.03%)alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::Leaf>::push (51,192,880 samples, 0.02%)alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::Leaf>::push_with_handle (51,192,880 samples, 0.02%)[libc.so.6] (320,174,468 samples, 0.10%)[libc.so.6] (311,379,169 samples, 0.10%)[unknown] (211,798,067 samples, 0.07%)[unknown] (207,435,128 samples, 0.06%)[unknown] (203,464,597 samples, 0.06%)[unknown] (193,338,707 samples, 0.06%)[unknown] (179,586,543 samples, 0.06%)[unknown] (150,129,225 samples, 0.05%)[unknown] (142,292,631 samples, 0.04%)[unknown] (136,342,781 samples, 0.04%)[unknown] (125,375,629 samples, 0.04%)[unknown] (101,183,297 samples, 0.03%)[unknown] (85,258,287 samples, 0.03%)[unknown] (76,225,059 samples, 0.02%)alloc::boxed::Box<T,A>::new_uninit_in (335,407,494 samples, 0.10%)alloc::boxed::Box<T,A>::try_new_uninit_in (333,448,671 samples, 0.10%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (333,448,671 samples, 0.10%)alloc::alloc::Global::alloc_impl (333,448,671 samples, 0.10%)alloc::alloc::alloc (333,448,671 samples, 0.10%)<alloc::collections::btree::map::BTreeMap<K,V,A> as core::clone::Clone>::clone::clone_subtree (489,279,546 samples, 0.15%)alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Owned,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::new (337,706,687 samples, 0.10%)alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Owned,K,V,alloc::collections::btree::node::marker::Leaf>::new_leaf (337,706,687 samples, 0.10%)alloc::collections::btree::node::LeafNode<K,V>::new (337,706,687 samples, 0.10%)[unknown] (48,696,796 samples, 0.02%)[libc.so.6] (48,696,796 samples, 0.02%)[unknown] (48,696,796 samples, 0.02%)alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,NodeType>,alloc::collections::btree::node::marker::Edge>::right_kv (571,951,236 samples, 0.18%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,Type>::len (411,110,812 samples, 0.13%)alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::Internal>,alloc::collections::btree::node::marker::Edge>::descend (146,735,643 samples, 0.05%)core::mem::maybe_uninit::MaybeUninit<T>::assume_init_read (32,468,049 samples, 0.01%)core::ptr::const_ptr::<impl *const T>::read (32,468,049 samples, 0.01%)core::ptr::read (32,468,049 samples, 0.01%)alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::Leaf>::push (173,148,991 samples, 0.05%)alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::Leaf>::push_with_handle (173,148,991 samples, 0.05%)alloc::sync::Arc<T>::new (82,854,783 samples, 0.03%)alloc::boxed::Box<T>::new (70,417,557 samples, 0.02%)alloc::alloc::exchange_malloc (62,119,086 samples, 0.02%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (62,119,086 samples, 0.02%)alloc::alloc::Global::alloc_impl (62,119,086 samples, 0.02%)alloc::alloc::alloc (62,119,086 samples, 0.02%)[libc.so.6] (62,119,086 samples, 0.02%)[libc.so.6] (57,976,810 samples, 0.02%)<rsprocess::choices::Choices as rsprocess::choices::BasicChoices>::shuffle (91,137,583 samples, 0.03%)[libc.so.6] (618,748,160 samples, 0.19%)[unknown] (470,337,026 samples, 0.15%)[unknown] (423,628,022 samples, 0.13%)[unknown] (418,696,095 samples, 0.13%)[unknown] (399,642,429 samples, 0.12%)[unknown] (376,557,983 samples, 0.12%)[unknown] (323,014,950 samples, 0.10%)[unknown] (300,760,638 samples, 0.09%)[unknown] (273,867,123 samples, 0.08%)[unknown] (248,915,920 samples, 0.08%)[unknown] (217,062,687 samples, 0.07%)[unknown] (189,868,090 samples, 0.06%)[unknown] (172,633,472 samples, 0.05%)[libc.so.6] (658,004,125 samples, 0.20%)alloc::boxed::Box<T,A>::new_uninit_in (817,709,635 samples, 0.25%)alloc::boxed::Box<T,A>::try_new_uninit_in (817,709,635 samples, 0.25%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (817,709,635 samples, 0.25%)alloc::alloc::Global::alloc_impl (817,709,635 samples, 0.25%)alloc::alloc::alloc (810,303,722 samples, 0.25%)malloc (43,846,527 samples, 0.01%)alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Owned,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::new (821,814,736 samples, 0.25%)alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Owned,K,V,alloc::collections::btree::node::marker::Leaf>::new_leaf (821,814,736 samples, 0.25%)alloc::collections::btree::node::LeafNode<K,V>::new (821,814,736 samples, 0.25%)[libc.so.6] (745,837,841 samples, 0.23%)[libc.so.6] (739,314,110 samples, 0.23%)[unknown] (618,070,387 samples, 0.19%)[unknown] (563,347,995 samples, 0.17%)[unknown] (542,556,988 samples, 0.17%)[unknown] (532,884,531 samples, 0.16%)[unknown] (484,915,072 samples, 0.15%)[unknown] (408,865,740 samples, 0.13%)[unknown] (380,792,672 samples, 0.12%)[unknown] (339,013,465 samples, 0.10%)[unknown] (300,444,707 samples, 0.09%)[unknown] (252,602,705 samples, 0.08%)[unknown] (210,499,934 samples, 0.07%)[unknown] (202,435,613 samples, 0.06%)alloc::collections::btree::node::InternalNode<K,V>::new (778,693,654 samples, 0.24%)alloc::boxed::Box<T,A>::new_uninit_in (774,061,452 samples, 0.24%)alloc::boxed::Box<T,A>::try_new_uninit_in (774,061,452 samples, 0.24%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (774,061,452 samples, 0.24%)alloc::alloc::Global::alloc_impl (774,061,452 samples, 0.24%)alloc::alloc::alloc (769,036,632 samples, 0.24%)alloc::collections::btree::mem::take_mut::{{closure}} (782,943,196 samples, 0.24%)alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Owned,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::push_internal_level::{{closure}} (782,943,196 samples, 0.24%)alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Owned,K,V,alloc::collections::btree::node::marker::Internal>::new_internal (782,943,196 samples, 0.24%)<alloc::collections::btree::map::BTreeMap<K,V,A> as core::clone::Clone>::clone::clone_subtree (3,119,132,153 samples, 0.96%)alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Owned,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::push_internal_level (784,879,202 samples, 0.24%)alloc::collections::btree::mem::take_mut (784,879,202 samples, 0.24%)alloc::collections::btree::mem::replace (784,879,202 samples, 0.24%)<alloc::alloc::Global as core::alloc::Allocator>::deallocate (86,496,839 samples, 0.03%)alloc::alloc::dealloc (86,496,839 samples, 0.03%)cfree (45,154,009 samples, 0.01%)alloc::collections::btree::navigate::LazyLeafRange<alloc::collections::btree::node::marker::Dying,K,V>::deallocating_end (136,620,143 samples, 0.04%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Dying,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::deallocating_end (136,620,143 samples, 0.04%)alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Dying,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::deallocate_and_ascend (136,620,143 samples, 0.04%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,Type>::ascend (50,123,304 samples, 0.02%)core::option::Option<T>::as_ref (38,128,177 samples, 0.01%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>,alloc::collections::btree::node::marker::KV>>::next_leaf_edge (74,421,399 samples, 0.02%)alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,NodeType>,alloc::collections::btree::node::marker::Edge>::right_kv (735,323,528 samples, 0.23%)[libc.so.6] (53,235,329 samples, 0.02%)<alloc::alloc::Global as core::alloc::Allocator>::deallocate (156,432,430 samples, 0.05%)alloc::alloc::dealloc (156,432,430 samples, 0.05%)cfree (94,892,260 samples, 0.03%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Dying,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::deallocating_next_unchecked (995,148,750 samples, 0.31%)alloc::collections::btree::mem::replace (995,148,750 samples, 0.31%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Dying,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::deallocating_next_unchecked::{{closure}} (995,148,750 samples, 0.31%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Dying,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::deallocating_next (995,148,750 samples, 0.31%)alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Dying,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::deallocate_and_ascend (185,403,823 samples, 0.06%)core::mem::drop (1,508,571,052 samples, 0.47%)core::ptr::drop_in_place<alloc::collections::btree::map::IntoIter<u32,alloc::collections::btree::set_val::SetValZST>> (1,475,513,953 samples, 0.46%)<alloc::collections::btree::map::IntoIter<K,V,A> as core::ops::drop::Drop>::drop (1,475,513,953 samples, 0.46%)alloc::collections::btree::map::IntoIter<K,V,A>::dying_next (1,475,513,953 samples, 0.46%)alloc::collections::btree::navigate::LazyLeafRange<alloc::collections::btree::node::marker::Dying,K,V>::deallocating_next_unchecked (1,243,884,691 samples, 0.38%)alloc::collections::btree::navigate::LazyLeafRange<BorrowType,K,V>::init_front (244,591,570 samples, 0.08%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::first_leaf_edge (215,564,636 samples, 0.07%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::force (215,564,636 samples, 0.07%)<alloc::collections::btree::map::BTreeMap<K,V,A> as core::ops::drop::Drop>::drop (1,529,241,769 samples, 0.47%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::next_back_kv (99,201,052 samples, 0.03%)alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,NodeType>,alloc::collections::btree::node::marker::Edge>::left_kv (99,201,052 samples, 0.03%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Immut,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::next_back_unchecked::{{closure}} (194,346,204 samples, 0.06%)alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Immut,K,V,NodeType>,alloc::collections::btree::node::marker::KV>::into_kv (95,145,152 samples, 0.03%)core::slice::<impl [T]>::get_unchecked (78,577,996 samples, 0.02%)<usize as core::slice::index::SliceIndex<[T]>>::get_unchecked (78,577,996 samples, 0.02%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Immut,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::next_back_unchecked (305,667,675 samples, 0.09%)alloc::collections::btree::mem::replace (305,667,675 samples, 0.09%)core::ptr::write (111,321,471 samples, 0.03%)alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::Internal>,alloc::collections::btree::node::marker::Edge>::descend (78,587,063 samples, 0.02%)core::mem::maybe_uninit::MaybeUninit<T>::assume_init_read (78,587,063 samples, 0.02%)core::ptr::const_ptr::<impl *const T>::read (78,587,063 samples, 0.02%)core::ptr::read (78,587,063 samples, 0.02%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::last_leaf_edge (612,430,703 samples, 0.19%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::force (463,483,632 samples, 0.14%)<alloc::collections::btree::map::Iter<K,V> as core::iter::traits::double_ended::DoubleEndedIterator>::next_back (1,662,924,376 samples, 0.51%)alloc::collections::btree::navigate::LazyLeafRange<alloc::collections::btree::node::marker::Immut,K,V>::next_back_unchecked (1,352,744,805 samples, 0.42%)alloc::collections::btree::navigate::LazyLeafRange<BorrowType,K,V>::init_back (1,047,077,130 samples, 0.32%)alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,NodeType>,alloc::collections::btree::node::marker::Edge>::right_kv (9,608,176,302 samples, 2.97%)all..alloc::collections::btree::node::NodeRef<BorrowType,K,V,Type>::len (1,815,998,598 samples, 0.56%)core::option::Option<T>::as_ref (823,204,807 samples, 0.25%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::next_kv (11,092,868,484 samples, 3.43%)all..alloc::collections::btree::node::NodeRef<BorrowType,K,V,Type>::ascend (963,879,330 samples, 0.30%)core::option::Option<T>::map (140,674,523 samples, 0.04%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,Type>::ascend::{{closure}} (140,674,523 samples, 0.04%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::first_leaf_edge (752,556,496 samples, 0.23%)alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::Internal>,alloc::collections::btree::node::marker::Edge>::descend (661,886,867 samples, 0.20%)alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::Internal>,alloc::collections::btree::node::marker::Edge>::descend (95,085,723 samples, 0.03%)core::slice::<impl [T]>::get_unchecked (95,085,723 samples, 0.03%)<usize as core::slice::index::SliceIndex<[T]>>::get_unchecked (95,085,723 samples, 0.03%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>,alloc::collections::btree::node::marker::KV>>::next_leaf_edge (2,825,315,388 samples, 0.87%)alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>,Type>::force (1,754,222,151 samples, 0.54%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::force (1,754,222,151 samples, 0.54%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Immut,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::next_unchecked::{{closure}} (17,858,883,783 samples, 5.52%)alloc::..alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Immut,K,V,NodeType>,alloc::collections::btree::node::marker::KV>::into_kv (3,940,699,911 samples, 1.22%)core::slice::<impl [T]>::get_unchecked (3,824,862,131 samples, 1.18%)<usize as core::slice::index::SliceIndex<[T]>>::get_unchecked (3,824,862,131 samples, 1.18%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Immut,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::next_unchecked (29,050,124,247 samples, 8.98%)alloc::collec..alloc::collections::btree::mem::replace (29,050,124,247 samples, 8.98%)alloc::collec..core::ptr::write (11,191,240,464 samples, 3.46%)cor..alloc::collections::btree::navigate::<impl alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::first_leaf_edge (1,001,374,842 samples, 0.31%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::force (815,069,916 samples, 0.25%)<alloc::collections::btree::map::Iter<K,V> as core::iter::traits::iterator::Iterator>::next (48,759,438,360 samples, 15.08%)<alloc::collections::bt..alloc::collections::btree::navigate::LazyLeafRange<alloc::collections::btree::node::marker::Immut,K,V>::next_unchecked (36,882,394,759 samples, 11.40%)alloc::collection..alloc::collections::btree::navigate::LazyLeafRange<BorrowType,K,V>::init_front (7,832,270,512 samples, 2.42%)al..core::ptr::read (698,381,353 samples, 0.22%)alloc::slice::<impl [T]>::sort (70,341,513 samples, 0.02%)alloc::slice::stable_sort (70,341,513 samples, 0.02%)core::slice::sort::stable::sort (70,341,513 samples, 0.02%)core::slice::sort::shared::smallsort::insertion_sort_shift_left (62,054,365 samples, 0.02%)core::slice::sort::shared::smallsort::insert_tail (49,627,401 samples, 0.02%)<alloc::collections::btree::set::BTreeSet<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (773,537,229 samples, 0.24%)<alloc::collections::btree::set::Difference<T,A> as core::iter::traits::iterator::Iterator>::next (670,957,238 samples, 0.21%)<alloc::collections::btree::set::Iter<T> as core::iter::traits::iterator::Iterator>::next (161,441,896 samples, 0.05%)<alloc::collections::btree::map::Keys<K,V> as core::iter::traits::iterator::Iterator>::next (161,441,896 samples, 0.05%)<core::option::Option<T> as core::ops::try_trait::Try>::branch (57,847,983 samples, 0.02%)core::cmp::impls::<impl core::cmp::Ord for u32>::cmp (368,302,759 samples, 0.11%)<alloc::collections::btree::set::Intersection<T,A> as core::iter::traits::iterator::Iterator>::next (2,254,911,054 samples, 0.70%)<alloc::vec::Vec<T,A> as core::clone::Clone>::clone (57,756,936 samples, 0.02%)alloc::slice::<impl [T]>::to_vec_in (57,756,936 samples, 0.02%)<T as alloc::slice::<impl [T]>::to_vec_in::ConvertVec>::to_vec (57,756,936 samples, 0.02%)core::mem::maybe_uninit::MaybeUninit<T>::write (46,651,576 samples, 0.01%)[libc.so.6] (46,651,576 samples, 0.01%)core::ops::function::FnOnce::call_once (727,908,224 samples, 0.23%)<alloc::collections::btree::set::Iter<T> as core::iter::traits::iterator::Iterator>::next (727,908,224 samples, 0.23%)<alloc::collections::btree::map::Keys<K,V> as core::iter::traits::iterator::Iterator>::next (727,908,224 samples, 0.23%)core::option::Option<T>::as_mut (2,265,161,365 samples, 0.70%)<core::iter::adapters::chain::Chain<A,B> as core::iter::traits::iterator::Iterator>::next (3,084,043,557 samples, 0.95%)core::iter::adapters::chain::and_then_or_clear (3,084,043,557 samples, 0.95%)core::option::Option<T>::is_none (70,349,914 samples, 0.02%)core::option::Option<T>::is_some (70,349,914 samples, 0.02%)<core::iter::adapters::cloned::Cloned<I> as core::iter::traits::iterator::Iterator>::next (3,237,014,166 samples, 1.00%)core::option::Option<&T>::cloned (152,970,609 samples, 0.05%)core::clone::impls::<impl core::clone::Clone for u32>::clone (66,194,619 samples, 0.02%)<core::iter::adapters::copied::Copied<I> as core::iter::traits::iterator::Iterator>::next (95,068,624 samples, 0.03%)core::option::Option<&T>::copied (86,884,642 samples, 0.03%)<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (8,207,041,350 samples, 2.54%)<a..alloc::vec::Vec<T,A>::extend_desugared (8,207,041,350 samples, 2.54%)al..core::iter::adapters::chain::and_then_or_clear (57,941,189 samples, 0.02%)<core::iter::adapters::cloned::Cloned<I> as core::iter::traits::iterator::Iterator>::next (66,197,908 samples, 0.02%)<core::iter::adapters::chain::Chain<A,B> as core::iter::traits::iterator::Iterator>::next (66,197,908 samples, 0.02%)<core::iter::adapters::cloned::Cloned<I> as core::iter::traits::iterator::Iterator>::size_hint (529,150,091 samples, 0.16%)<core::iter::adapters::chain::Chain<A,B> as core::iter::traits::iterator::Iterator>::size_hint (529,150,091 samples, 0.16%)core::num::<impl usize>::saturating_add (78,532,053 samples, 0.02%)<core::iter::adapters::copied::Copied<I> as core::iter::traits::iterator::Iterator>::next (91,073,746 samples, 0.03%)core::option::Option<&T>::copied (82,786,071 samples, 0.03%)core::iter::traits::exact_size::ExactSizeIterator::len (49,555,833 samples, 0.02%)<core::iter::adapters::copied::Copied<I> as core::iter::traits::iterator::Iterator>::size_hint (152,992,302 samples, 0.05%)<alloc::collections::btree::set::Difference<T,A> as core::iter::traits::iterator::Iterator>::size_hint (152,992,302 samples, 0.05%)[libc.so.6] (11,011,576,241 samples, 3.40%)[li..alloc::vec::Vec<T>::new (185,835,199 samples, 0.06%)[libc.so.6] (120,019,049 samples, 0.04%)[libc.so.6] (86,906,139 samples, 0.03%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (4,442,796,638 samples, 1.37%)alloc::alloc::Global::alloc_impl (4,442,796,638 samples, 1.37%)alloc::alloc::alloc (4,442,796,638 samples, 1.37%)malloc (1,885,868,865 samples, 0.58%)__rustc::__rust_no_alloc_shim_is_unstable_v2 (1,005,272,390 samples, 0.31%)core::intrinsics::unlikely (372,074,498 samples, 0.12%)alloc::vec::Vec<T>::with_capacity (6,597,833,676 samples, 2.04%)a..alloc::vec::Vec<T,A>::with_capacity_in (6,597,833,676 samples, 2.04%)a..alloc::raw_vec::RawVec<T,A>::with_capacity_in (6,597,833,676 samples, 2.04%)a..alloc::raw_vec::RawVecInner<A>::with_capacity_in (6,597,833,676 samples, 2.04%)a..alloc::raw_vec::RawVecInner<A>::try_allocate_in (6,597,833,676 samples, 2.04%)a..alloc::raw_vec::layout_array (814,710,630 samples, 0.25%)core::alloc::layout::Layout::repeat (814,710,630 samples, 0.25%)core::alloc::layout::Layout::repeat_packed (814,710,630 samples, 0.25%)core::num::<impl usize>::checked_mul (814,710,630 samples, 0.25%)core::num::<impl usize>::overflowing_mul (442,636,132 samples, 0.14%)core::cmp::max (244,148,442 samples, 0.08%)core::cmp::Ord::max (244,148,442 samples, 0.08%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (29,070,557,541 samples, 8.99%)<alloc::vec::..core::num::<impl usize>::saturating_add (244,104,117 samples, 0.08%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (32,431,012,723 samples, 10.03%)<alloc::vec::V..alloc::vec::Vec<T>::from_parts (78,639,602 samples, 0.02%)alloc::vec::Vec<T,A>::from_parts_in (78,639,602 samples, 0.02%)core::cmp::PartialEq::ne (1,224,564,974 samples, 0.38%)<core::ptr::non_null::NonNull<T> as core::cmp::PartialEq>::eq (1,224,564,974 samples, 0.38%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,alloc::vec::into_iter::IntoIter<T>>>::from_iter (2,775,331,710 samples, 0.86%)core::iter::traits::exact_size::ExactSizeIterator::len (206,866,112 samples, 0.06%)<alloc::vec::into_iter::IntoIter<T,A> as core::iter::traits::iterator::Iterator>::size_hint (206,866,112 samples, 0.06%)core::ptr::non_null::NonNull<T>::offset_from_unsigned (206,866,112 samples, 0.06%)core::ptr::mut_ptr::<impl *mut T>::offset_from_unsigned (206,866,112 samples, 0.06%)core::ptr::const_ptr::<impl *const T>::offset_from_unsigned (206,866,112 samples, 0.06%)alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,NodeType>,alloc::collections::btree::node::marker::Edge>::right_kv (72,265,069 samples, 0.02%)alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::Leaf>::push (49,279,924 samples, 0.02%)alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::Leaf>::push_with_handle (49,279,924 samples, 0.02%)[libc.so.6] (171,297,653 samples, 0.05%)[libc.so.6] (167,363,232 samples, 0.05%)[unknown] (118,754,420 samples, 0.04%)[unknown] (111,019,800 samples, 0.03%)[unknown] (107,144,701 samples, 0.03%)[unknown] (101,165,108 samples, 0.03%)[unknown] (93,399,655 samples, 0.03%)[unknown] (70,602,306 samples, 0.02%)[unknown] (62,642,890 samples, 0.02%)[unknown] (56,808,468 samples, 0.02%)[unknown] (48,975,968 samples, 0.02%)[unknown] (48,975,968 samples, 0.02%)[unknown] (43,263,692 samples, 0.01%)[unknown] (40,410,313 samples, 0.01%)alloc::boxed::Box<T,A>::new_uninit_in (195,086,112 samples, 0.06%)alloc::boxed::Box<T,A>::try_new_uninit_in (195,086,112 samples, 0.06%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (195,086,112 samples, 0.06%)alloc::alloc::Global::alloc_impl (195,086,112 samples, 0.06%)alloc::alloc::alloc (195,086,112 samples, 0.06%)<rsprocess::label::Label as core::clone::Clone>::clone (340,832,837 samples, 0.11%)<rsprocess::set::Set as core::clone::Clone>::clone (338,706,068 samples, 0.10%)<alloc::collections::btree::set::BTreeSet<T,A> as core::clone::Clone>::clone (338,706,068 samples, 0.10%)<alloc::collections::btree::map::BTreeMap<K,V,A> as core::clone::Clone>::clone (338,706,068 samples, 0.10%)<alloc::collections::btree::map::BTreeMap<K,V,A> as core::clone::Clone>::clone::clone_subtree (322,556,670 samples, 0.10%)alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Owned,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::new (197,072,257 samples, 0.06%)alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Owned,K,V,alloc::collections::btree::node::marker::Leaf>::new_leaf (197,072,257 samples, 0.06%)alloc::collections::btree::node::LeafNode<K,V>::new (197,072,257 samples, 0.06%)<petgraph::graph_impl::Edge<E,Ix> as core::clone::Clone>::clone (355,661,903 samples, 0.11%)[libc.so.6] (210,939,750 samples, 0.07%)[libc.so.6] (210,939,750 samples, 0.07%)alloc::sync::Arc<T>::new (235,795,144 samples, 0.07%)alloc::boxed::Box<T>::new (223,363,480 samples, 0.07%)alloc::alloc::exchange_malloc (223,363,480 samples, 0.07%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (223,363,480 samples, 0.07%)alloc::alloc::Global::alloc_impl (223,363,480 samples, 0.07%)alloc::alloc::alloc (223,363,480 samples, 0.07%)<rsprocess::choices::Choices as rsprocess::choices::BasicChoices>::shuffle (244,057,488 samples, 0.08%)[libc.so.6] (33,137,999 samples, 0.01%)[libc.so.6] (33,137,999 samples, 0.01%)alloc::sync::Arc<T>::new (37,274,552 samples, 0.01%)alloc::boxed::Box<T>::new (37,274,552 samples, 0.01%)alloc::alloc::exchange_malloc (37,274,552 samples, 0.01%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (37,274,552 samples, 0.01%)alloc::alloc::Global::alloc_impl (37,274,552 samples, 0.01%)alloc::alloc::alloc (37,274,552 samples, 0.01%)<rsprocess::environment::Environment as rsprocess::environment::BasicEnvironment>::unfold (49,715,894 samples, 0.02%)<alloc::sync::Arc<T,A> as core::clone::Clone>::clone (45,315,816 samples, 0.01%)<rsprocess::process::Process as core::clone::Clone>::clone (73,760,142 samples, 0.02%)<alloc::vec::Vec<T,A> as core::clone::Clone>::clone (53,610,059 samples, 0.02%)alloc::slice::<impl [T]>::to_vec_in (53,610,059 samples, 0.02%)<T as alloc::slice::<impl [T]>::to_vec_in::ConvertVec>::to_vec (53,610,059 samples, 0.02%)alloc::vec::partial_eq::<impl core::cmp::PartialEq<alloc::vec::Vec<U,A2>> for alloc::vec::Vec<T,A1>>::eq (33,149,154 samples, 0.01%)core::slice::cmp::<impl core::cmp::PartialEq<[U]> for [T]>::eq (33,149,154 samples, 0.01%)<[A] as core::slice::cmp::SlicePartialEq<B>>::equal (33,149,154 samples, 0.01%)<alloc::sync::Arc<T,A> as core::cmp::PartialEq>::ne (33,149,154 samples, 0.01%)<alloc::sync::Arc<T,A> as alloc::sync::ArcEqIdent<T,A>>::ne (33,149,154 samples, 0.01%)alloc::sync::Arc<T,A>::ptr_eq (33,149,154 samples, 0.01%)<rsprocess::process::Process as core::cmp::PartialEq>::eq (91,130,907 samples, 0.03%)core::cmp::impls::<impl core::cmp::PartialEq<&B> for &A>::eq (37,289,057 samples, 0.01%)<alloc::collections::btree::map::BTreeMap<K,V,A> as core::cmp::PartialEq>::eq (49,665,791 samples, 0.02%)<rsprocess::process::Process as core::hash::Hash>::hash (70,376,887 samples, 0.02%)<alloc::vec::Vec<T,A> as core::hash::Hash>::hash (57,957,530 samples, 0.02%)core::hash::impls::<impl core::hash::Hash for [T]>::hash (57,957,530 samples, 0.02%)core::hash::Hash::hash_slice (57,957,530 samples, 0.02%)<alloc::sync::Arc<T,A> as core::hash::Hash>::hash (57,957,530 samples, 0.02%)[libc.so.6] (70,311,635 samples, 0.02%)[libc.so.6] (45,551,725 samples, 0.01%)<rsprocess::process::Process as rsprocess::process::BasicProcess>::concat (99,303,805 samples, 0.03%)alloc::sync::Arc<T>::new (78,596,842 samples, 0.02%)alloc::boxed::Box<T>::new (78,596,842 samples, 0.02%)alloc::alloc::exchange_malloc (78,596,842 samples, 0.02%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (78,596,842 samples, 0.02%)alloc::alloc::Global::alloc_impl (78,596,842 samples, 0.02%)alloc::alloc::alloc (78,596,842 samples, 0.02%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (210,950,799 samples, 0.07%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (210,950,799 samples, 0.07%)alloc::vec::Vec<T>::with_capacity (210,950,799 samples, 0.07%)alloc::vec::Vec<T,A>::with_capacity_in (210,950,799 samples, 0.07%)alloc::raw_vec::RawVec<T,A>::with_capacity_in (210,950,799 samples, 0.07%)alloc::raw_vec::RawVecInner<A>::with_capacity_in (210,950,799 samples, 0.07%)alloc::raw_vec::RawVecInner<A>::try_allocate_in (210,950,799 samples, 0.07%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (186,113,014 samples, 0.06%)alloc::alloc::Global::alloc_impl (186,113,014 samples, 0.06%)alloc::alloc::alloc (186,113,014 samples, 0.06%)malloc (181,972,592 samples, 0.06%)alloc::collections::btree::set::BTreeSet<T,A>::from_sorted_iter (239,931,895 samples, 0.07%)alloc::slice::<impl [T]>::sort (49,666,728 samples, 0.02%)alloc::slice::stable_sort (49,666,728 samples, 0.02%)core::slice::sort::stable::sort (49,666,728 samples, 0.02%)core::slice::sort::shared::smallsort::insertion_sort_shift_left (33,109,427 samples, 0.01%)core::iter::traits::iterator::Iterator::collect (1,457,176,915 samples, 0.45%)<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (1,457,176,915 samples, 0.45%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (1,428,235,677 samples, 0.44%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (1,411,780,714 samples, 0.44%)alloc::vec::Vec<T>::with_capacity (1,411,780,714 samples, 0.44%)alloc::vec::Vec<T,A>::with_capacity_in (1,411,780,714 samples, 0.44%)alloc::raw_vec::RawVec<T,A>::with_capacity_in (1,411,780,714 samples, 0.44%)alloc::raw_vec::RawVecInner<A>::with_capacity_in (1,411,780,714 samples, 0.44%)alloc::raw_vec::RawVecInner<A>::try_allocate_in (1,411,780,714 samples, 0.44%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (1,261,602,407 samples, 0.39%)alloc::alloc::Global::alloc_impl (1,261,602,407 samples, 0.39%)alloc::alloc::alloc (1,261,602,407 samples, 0.39%)malloc (1,240,884,703 samples, 0.38%)<rsprocess::set::Set as rsprocess::set::BasicSet>::intersection (3,648,032,696 samples, 1.13%)core::iter::traits::iterator::Iterator::collect (2,395,955,674 samples, 0.74%)<alloc::collections::btree::set::BTreeSet<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (2,395,955,674 samples, 0.74%)<alloc::collections::btree::set::Iter<T> as core::iter::traits::double_ended::DoubleEndedIterator>::next_back (119,778,012 samples, 0.04%)<alloc::collections::btree::map::Keys<K,V> as core::iter::traits::double_ended::DoubleEndedIterator>::next_back (119,778,012 samples, 0.04%)<alloc::collections::btree::set::Iter<T> as core::iter::traits::iterator::Iterator>::next (582,676,008 samples, 0.18%)<alloc::collections::btree::map::Keys<K,V> as core::iter::traits::iterator::Iterator>::next (582,676,008 samples, 0.18%)alloc::collections::btree::set::BTreeSet<T,A>::first (789,454,910 samples, 0.24%)alloc::collections::btree::map::BTreeMap<K,V,A>::first_key_value (789,454,910 samples, 0.24%)alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,NodeType>,alloc::collections::btree::node::marker::Edge>::right_kv (789,454,910 samples, 0.24%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,Type>::len (789,454,910 samples, 0.24%)alloc::collections::btree::set::BTreeSet<T,A>::iter (388,946,693 samples, 0.12%)alloc::collections::btree::set::BTreeSet<T,A>::len (693,972,085 samples, 0.21%)alloc::collections::btree::map::BTreeMap<K,V,A>::len (693,972,085 samples, 0.21%)core::cmp::impls::<impl core::cmp::Ord for u32>::cmp (368,108,971 samples, 0.11%)<rsprocess::set::Set as rsprocess::set::BasicSet>::is_subset (8,895,435,220 samples, 2.75%)<r..alloc::collections::btree::set::BTreeSet<T,A>::is_subset (8,059,615,642 samples, 2.49%)al..core::option::Option<T>::map_or (1,479,008,371 samples, 0.46%)alloc::collections::btree::set::BTreeSet<T,A>::is_subset::{{closure}} (1,479,008,371 samples, 0.46%)core::cmp::impls::<impl core::cmp::Ord for u32>::cmp (1,479,008,371 samples, 0.46%)alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::Internal>,alloc::collections::btree::node::marker::Edge>::descend (57,949,635 samples, 0.02%)core::mem::maybe_uninit::MaybeUninit<T>::assume_init_read (57,949,635 samples, 0.02%)core::ptr::const_ptr::<impl *const T>::read (57,949,635 samples, 0.02%)core::ptr::read (57,949,635 samples, 0.02%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::first_leaf_edge (165,381,019 samples, 0.05%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::force (74,312,045 samples, 0.02%)alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,NodeType>,alloc::collections::btree::node::marker::Edge>::right_kv (136,452,508 samples, 0.04%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,Type>::len (111,623,067 samples, 0.03%)alloc::collections::btree::set::BTreeSet<T,A>::first (492,063,112 samples, 0.15%)alloc::collections::btree::map::BTreeMap<K,V,A>::first_key_value (492,063,112 samples, 0.15%)core::option::Option<T>::as_ref (190,229,585 samples, 0.06%)alloc::collections::btree::set::BTreeSet<T,A>::iter (235,295,425 samples, 0.07%)alloc::collections::btree::map::BTreeMap<K,V,A>::keys (235,295,425 samples, 0.07%)alloc::collections::btree::map::BTreeMap<K,V,A>::iter (235,295,425 samples, 0.07%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,Type>::last_edge (260,710,502 samples, 0.08%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,Type>::len (260,710,502 samples, 0.08%)alloc::collections::btree::set::BTreeSet<T,A>::difference (1,889,068,206 samples, 0.58%)alloc::collections::btree::set::BTreeSet<T,A>::last (500,066,113 samples, 0.15%)alloc::collections::btree::map::BTreeMap<K,V,A>::last_key_value (500,066,113 samples, 0.15%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::last_leaf_edge (500,066,113 samples, 0.15%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::force (210,470,252 samples, 0.07%)<alloc::vec::Vec<T,A> as core::iter::traits::collect::IntoIterator>::into_iter (53,622,909 samples, 0.02%)core::ptr::mut_ptr::<impl *mut T>::add (53,622,909 samples, 0.02%)<alloc::vec::Vec<T,A> as core::ops::deref::DerefMut>::deref_mut (140,285,109 samples, 0.04%)alloc::vec::Vec<T,A>::as_mut_slice (140,285,109 samples, 0.04%)alloc::vec::Vec<T,A>::as_mut_ptr (140,285,109 samples, 0.04%)alloc::raw_vec::RawVec<T,A>::ptr (140,285,109 samples, 0.04%)alloc::raw_vec::RawVecInner<A>::ptr (140,285,109 samples, 0.04%)alloc::raw_vec::RawVecInner<A>::non_null (140,285,109 samples, 0.04%)alloc::collections::btree::set::BTreeSet<T,A>::from_sorted_iter (227,550,382 samples, 0.07%)core::iter::traits::iterator::Iterator::map (182,043,177 samples, 0.06%)core::iter::adapters::map::Map<I,F>::new (182,043,177 samples, 0.06%)core::intrinsics::likely (86,879,533 samples, 0.03%)alloc::slice::<impl [T]>::sort (194,358,661 samples, 0.06%)alloc::slice::stable_sort (194,358,661 samples, 0.06%)core::slice::sort::stable::sort (194,358,661 samples, 0.06%)core::slice::sort::shared::smallsort::insertion_sort_shift_left (107,479,128 samples, 0.03%)core::slice::sort::shared::smallsort::insert_tail (99,229,078 samples, 0.03%)<I as core::iter::traits::collect::IntoIterator>::into_iter (263,386,949 samples, 0.08%)core::iter::traits::iterator::Iterator::collect (325,502,572 samples, 0.10%)<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (325,502,572 samples, 0.10%)<rsprocess::set::Set as rsprocess::set::BasicSet>::subtraction (3,949,798,511 samples, 1.22%)core::iter::traits::iterator::Iterator::collect (1,251,639,693 samples, 0.39%)<alloc::collections::btree::set::BTreeSet<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (1,251,639,693 samples, 0.39%)<alloc::collections::btree::set::Iter<T> as core::iter::traits::iterator::Iterator>::next (372,311,907 samples, 0.12%)<alloc::collections::btree::map::Keys<K,V> as core::iter::traits::iterator::Iterator>::next (372,311,907 samples, 0.12%)<core::iter::adapters::peekable::Peekable<I> as core::iter::traits::iterator::Iterator>::next (2,971,889,817 samples, 0.92%)core::option::Option<T>::take (2,971,889,817 samples, 0.92%)core::mem::replace (2,971,889,817 samples, 0.92%)<core::option::Option<T> as core::ops::try_trait::Try>::branch (78,496,058 samples, 0.02%)core::option::Option<T>::as_ref (86,721,758 samples, 0.03%)core::iter::adapters::peekable::Peekable<I>::peek (8,311,853,725 samples, 2.57%)co..core::option::Option<T>::get_or_insert_with (8,225,131,967 samples, 2.54%)co..core::iter::adapters::peekable::Peekable<I>::peek::{{closure}} (955,284,967 samples, 0.30%)<alloc::collections::btree::set::Iter<T> as core::iter::traits::iterator::Iterator>::next (955,284,967 samples, 0.30%)<alloc::collections::btree::map::Keys<K,V> as core::iter::traits::iterator::Iterator>::next (955,284,967 samples, 0.30%)<alloc::collections::btree::set::Difference<T,A> as core::iter::traits::iterator::Iterator>::next (14,344,945,658 samples, 4.44%)<allo..core::option::Option<T>::map_or (153,037,153 samples, 0.05%)<alloc::collections::btree::set::Difference<T,A> as core::iter::traits::iterator::Iterator>::next::{{closure}} (153,037,153 samples, 0.05%)core::cmp::impls::<impl core::cmp::Ord for u32>::cmp (153,037,153 samples, 0.05%)<rsprocess::reaction::Reaction as rsprocess::reaction::BasicReaction>::enabled (529,456,446 samples, 0.16%)<rsprocess::set::Set as rsprocess::set::BasicSet>::is_disjoint (57,873,426 samples, 0.02%)alloc::collections::btree::set::BTreeSet<T,A>::is_disjoint (57,873,426 samples, 0.02%)alloc::collections::btree::set::BTreeSet<T,A>::intersection (49,609,283 samples, 0.02%)<T as core::convert::Into<U>>::into (379,819,154 samples, 0.12%)<rsprocess::set::Set as core::convert::From<alloc::vec::Vec<u32>>>::from (379,819,154 samples, 0.12%)alloc::collections::btree::fix::<impl alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Owned,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::fix_right_border_of_plentiful (277,007,530 samples, 0.09%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::force (37,240,567 samples, 0.01%)<T as rsprocess::set::ExtensionsSet>::iter (1,012,472,394 samples, 0.31%)<&rsprocess::set::Set as core::iter::traits::collect::IntoIterator>::into_iter (1,012,472,394 samples, 0.31%)alloc::collections::btree::set::BTreeSet<T,A>::iter (1,012,472,394 samples, 0.31%)alloc::collections::btree::map::BTreeMap<K,V,A>::keys (1,012,472,394 samples, 0.31%)alloc::collections::btree::map::BTreeMap<K,V,A>::iter (1,012,472,394 samples, 0.31%)<rsprocess::set::Set as rsprocess::set::BasicSet>::union (2,587,471,892 samples, 0.80%)core::iter::traits::iterator::Iterator::collect (1,174,492,565 samples, 0.36%)<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (1,174,492,565 samples, 0.36%)<I as core::iter::traits::collect::IntoIterator>::into_iter (1,062,801,902 samples, 0.33%)<alloc::collections::btree::map::BTreeMap<K,V,A> as core::iter::traits::collect::IntoIterator>::into_iter (1,518,052,761 samples, 0.47%)<rsprocess::transitions::TransitionsIterator<rsprocess::set::Set,rsprocess::system::System,rsprocess::process::Process> as core::iter::traits::iterator::Iterator>::next::{{closure}} (22,587,414,059 samples, 6.98%)<rsproces..core::ptr::drop_in_place<rsprocess::set::Set> (3,562,117,312 samples, 1.10%)core::ptr::drop_in_place<alloc::collections::btree::set::BTreeSet<u32>> (3,562,117,312 samples, 1.10%)core::ptr::drop_in_place<alloc::collections::btree::map::BTreeMap<u32,alloc::collections::btree::set_val::SetValZST>> (3,562,117,312 samples, 1.10%)<alloc::collections::btree::map::BTreeMap<K,V,A> as core::ops::drop::Drop>::drop (3,562,117,312 samples, 1.10%)core::mem::drop (2,044,064,551 samples, 0.63%)core::ptr::drop_in_place<alloc::collections::btree::map::IntoIter<u32,alloc::collections::btree::set_val::SetValZST>> (2,044,064,551 samples, 0.63%)<alloc::collections::btree::map::IntoIter<K,V,A> as core::ops::drop::Drop>::drop (2,044,064,551 samples, 0.63%)<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::fold (23,881,538,870 samples, 7.38%)<core::sli..core::ptr::non_null::NonNull<T>::add (49,558,399 samples, 0.02%)<rsprocess::transitions::TransitionsIterator<rsprocess::set::Set,rsprocess::system::System,rsprocess::process::Process> as core::iter::traits::iterator::Iterator>::next (23,917,825,473 samples, 7.40%)<rsprocess..<std::hash::random::DefaultHasher as core::hash::Hasher>::write (37,274,248 samples, 0.01%)<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (37,274,248 samples, 0.01%)<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (37,274,248 samples, 0.01%)<alloc::collections::btree::map::Iter<K,V> as core::iter::traits::iterator::Iterator>::next (37,225,137 samples, 0.01%)<core::iter::adapters::copied::Copied<I> as core::iter::traits::iterator::Iterator>::next (37,210,413 samples, 0.01%)core::option::Option<&T>::copied (33,065,453 samples, 0.01%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (1,166,211,995 samples, 0.36%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (955,201,416 samples, 0.30%)<core::iter::adapters::copied::Copied<I> as core::iter::traits::iterator::Iterator>::size_hint (562,593,604 samples, 0.17%)<alloc::collections::btree::set::Difference<T,A> as core::iter::traits::iterator::Iterator>::size_hint (562,593,604 samples, 0.17%)core::iter::traits::exact_size::ExactSizeIterator::len (351,530,861 samples, 0.11%)<core::iter::adapters::peekable::Peekable<I> as core::iter::traits::iterator::Iterator>::size_hint (351,530,861 samples, 0.11%)core::num::<impl usize>::checked_add (99,285,009 samples, 0.03%)core::intrinsics::unlikely (95,139,117 samples, 0.03%)[unknown] (127,206,957 samples, 0.04%)[libc.so.6] (1,399,700,005 samples, 0.43%)<alloc::collections::btree::map::BTreeMap<K,V,A> as core::clone::Clone>::clone::clone_subtree (32,657,448 samples, 0.01%)alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,NodeType>,alloc::collections::btree::node::marker::Edge>::right_kv (78,585,881 samples, 0.02%)alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::Leaf>::push (45,513,275 samples, 0.01%)alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::Leaf>::push_with_handle (45,513,275 samples, 0.01%)<alloc::collections::btree::map::BTreeMap<K,V,A> as core::clone::Clone>::clone::clone_subtree (242,935,240 samples, 0.08%)alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Owned,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::new (63,383,980 samples, 0.02%)alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Owned,K,V,alloc::collections::btree::node::marker::Leaf>::new_leaf (63,383,980 samples, 0.02%)alloc::collections::btree::node::LeafNode<K,V>::new (63,383,980 samples, 0.02%)alloc::boxed::Box<T,A>::new_uninit_in (63,383,980 samples, 0.02%)alloc::boxed::Box<T,A>::try_new_uninit_in (59,239,358 samples, 0.02%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (59,239,358 samples, 0.02%)alloc::alloc::Global::alloc_impl (59,239,358 samples, 0.02%)alloc::alloc::alloc (51,236,388 samples, 0.02%)<alloc::collections::btree::map::BTreeMap<K,V,A> as core::hash::Hash>::hash (33,138,900 samples, 0.01%)<alloc::alloc::Global as core::alloc::Allocator>::deallocate (78,652,635 samples, 0.02%)alloc::alloc::dealloc (78,652,635 samples, 0.02%)cfree (33,117,617 samples, 0.01%)alloc::collections::btree::navigate::LazyLeafRange<alloc::collections::btree::node::marker::Dying,K,V>::deallocating_end (194,762,397 samples, 0.06%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Dying,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::deallocating_end (194,762,397 samples, 0.06%)alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Dying,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::deallocate_and_ascend (194,762,397 samples, 0.06%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,Type>::ascend (116,109,762 samples, 0.04%)core::option::Option<T>::as_ref (107,801,642 samples, 0.03%)core::mem::drop (207,165,548 samples, 0.06%)core::ptr::drop_in_place<alloc::collections::btree::map::IntoIter<u32,alloc::collections::btree::set_val::SetValZST>> (207,165,548 samples, 0.06%)<alloc::collections::btree::map::IntoIter<K,V,A> as core::ops::drop::Drop>::drop (207,165,548 samples, 0.06%)alloc::collections::btree::map::IntoIter<K,V,A>::dying_next (207,165,548 samples, 0.06%)<alloc::collections::btree::map::BTreeMap<K,V,A> as core::ops::drop::Drop>::drop (211,319,546 samples, 0.07%)<alloc::collections::btree::map::Iter<K,V> as core::iter::traits::double_ended::DoubleEndedIterator>::next_back (70,053,518 samples, 0.02%)alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,NodeType>,alloc::collections::btree::node::marker::Edge>::right_kv (649,312,461 samples, 0.20%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::next_kv (843,818,731 samples, 0.26%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,Type>::ascend (41,373,978 samples, 0.01%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::first_leaf_edge (260,777,089 samples, 0.08%)alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::Internal>,alloc::collections::btree::node::marker::Edge>::descend (240,047,370 samples, 0.07%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>,alloc::collections::btree::node::marker::KV>>::next_leaf_edge (492,430,297 samples, 0.15%)alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>,Type>::force (190,267,215 samples, 0.06%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::force (190,267,215 samples, 0.06%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Immut,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::next_unchecked::{{closure}} (1,795,182,919 samples, 0.56%)alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Immut,K,V,NodeType>,alloc::collections::btree::node::marker::KV>::into_kv (458,933,891 samples, 0.14%)core::slice::<impl [T]>::get_unchecked (454,836,992 samples, 0.14%)<usize as core::slice::index::SliceIndex<[T]>>::get_unchecked (454,836,992 samples, 0.14%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Immut,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::next_unchecked (2,502,615,557 samples, 0.77%)alloc::collections::btree::mem::replace (2,502,615,557 samples, 0.77%)core::ptr::write (707,432,638 samples, 0.22%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::first_leaf_edge (45,556,471 samples, 0.01%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::force (37,277,547 samples, 0.01%)<alloc::collections::btree::map::Iter<K,V> as core::iter::traits::iterator::Iterator>::next (7,593,929,043 samples, 2.35%)<..alloc::collections::btree::navigate::LazyLeafRange<alloc::collections::btree::node::marker::Immut,K,V>::next_unchecked (2,717,729,663 samples, 0.84%)alloc::collections::btree::navigate::LazyLeafRange<BorrowType,K,V>::init_front (215,114,106 samples, 0.07%)core::mem::manually_drop::ManuallyDrop<T>::new (744,874,597 samples, 0.23%)<alloc::vec::Vec<T,A> as core::iter::traits::collect::IntoIterator>::into_iter (1,121,444,969 samples, 0.35%)core::ptr::mut_ptr::<impl *mut T>::add (376,570,372 samples, 0.12%)<alloc::vec::Vec<T,A> as core::ops::deref::DerefMut>::deref_mut (57,873,667 samples, 0.02%)alloc::vec::Vec<T,A>::as_mut_slice (57,873,667 samples, 0.02%)alloc::vec::Vec<T,A>::as_mut_ptr (57,873,667 samples, 0.02%)alloc::raw_vec::RawVec<T,A>::ptr (57,873,667 samples, 0.02%)alloc::raw_vec::RawVecInner<A>::ptr (57,873,667 samples, 0.02%)alloc::raw_vec::RawVecInner<A>::non_null (57,873,667 samples, 0.02%)alloc::collections::btree::set::BTreeSet<T,A>::from_sorted_iter (615,435,570 samples, 0.19%)core::iter::traits::iterator::Iterator::map (598,959,796 samples, 0.19%)core::iter::adapters::map::Map<I,F>::new (598,959,796 samples, 0.19%)core::intrinsics::likely (364,093,718 samples, 0.11%)core::ptr::mut_ptr::<impl *mut T>::add (550,288,688 samples, 0.17%)core::ops::function::FnMut::call_mut (82,602,843 samples, 0.03%)core::cmp::impls::<impl core::cmp::PartialOrd for u32>::lt (82,602,843 samples, 0.03%)core::ptr::copy_nonoverlapping (231,176,988 samples, 0.07%)alloc::slice::<impl [T]>::sort (6,140,006,748 samples, 1.90%)a..alloc::slice::stable_sort (6,140,006,748 samples, 1.90%)a..core::slice::sort::stable::sort (6,140,006,748 samples, 1.90%)c..core::slice::sort::shared::smallsort::insertion_sort_shift_left (5,635,619,083 samples, 1.74%)core::slice::sort::shared::smallsort::insert_tail (4,043,346,601 samples, 1.25%)<alloc::collections::btree::set::BTreeSet<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (10,801,403,847 samples, 3.34%)<al..core::iter::traits::iterator::Iterator::collect (425,847,260 samples, 0.13%)<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (425,847,260 samples, 0.13%)<I as core::iter::traits::collect::IntoIterator>::into_iter (347,504,708 samples, 0.11%)<alloc::collections::btree::set::Difference<T,A> as core::iter::traits::iterator::Iterator>::next (479,368,028 samples, 0.15%)<alloc::collections::btree::set::Intersection<T,A> as core::iter::traits::iterator::Iterator>::next (128,147,659 samples, 0.04%)core::iter::adapters::chain::and_then_or_clear (268,963,044 samples, 0.08%)core::option::Option<T>::as_mut (268,963,044 samples, 0.08%)<alloc::collections::btree::set::Iter<T> as core::iter::traits::iterator::Iterator>::next (281,373,698 samples, 0.09%)<alloc::collections::btree::map::Keys<K,V> as core::iter::traits::iterator::Iterator>::next (281,373,698 samples, 0.09%)<core::iter::adapters::chain::Chain<A,B> as core::iter::traits::iterator::Iterator>::next (1,373,051,727 samples, 0.42%)core::option::Option<T>::or_else (1,104,088,683 samples, 0.34%)<core::iter::adapters::chain::Chain<A,B> as core::iter::traits::iterator::Iterator>::next::{{closure}} (1,104,088,683 samples, 0.34%)core::option::Option<T>::as_mut (822,714,985 samples, 0.25%)<core::iter::adapters::cloned::Cloned<I> as core::iter::traits::iterator::Iterator>::next (1,426,887,888 samples, 0.44%)core::option::Option<&T>::cloned (53,836,161 samples, 0.02%)<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (3,180,074,787 samples, 0.98%)alloc::vec::Vec<T,A>::extend_desugared (3,180,074,787 samples, 0.98%)core::ptr::write (131,856,780 samples, 0.04%)core::iter::adapters::chain::and_then_or_clear (37,240,247 samples, 0.01%)<core::iter::adapters::cloned::Cloned<I> as core::iter::traits::iterator::Iterator>::next (49,664,867 samples, 0.02%)<core::iter::adapters::chain::Chain<A,B> as core::iter::traits::iterator::Iterator>::next (49,664,867 samples, 0.02%)<core::iter::adapters::cloned::Cloned<I> as core::iter::traits::iterator::Iterator>::size_hint (678,377,170 samples, 0.21%)<core::iter::adapters::chain::Chain<A,B> as core::iter::traits::iterator::Iterator>::size_hint (678,377,170 samples, 0.21%)core::num::<impl usize>::saturating_add (99,331,632 samples, 0.03%)<core::iter::adapters::copied::Copied<I> as core::iter::traits::iterator::Iterator>::next (49,647,396 samples, 0.02%)core::option::Option<&T>::copied (49,647,396 samples, 0.02%)<core::iter::adapters::copied::Copied<I> as core::iter::traits::iterator::Iterator>::size_hint (37,224,099 samples, 0.01%)<alloc::collections::btree::set::Difference<T,A> as core::iter::traits::iterator::Iterator>::size_hint (37,224,099 samples, 0.01%)[libc.so.6] (301,738,145 samples, 0.09%)alloc::vec::Vec<T>::new (78,586,465 samples, 0.02%)[libc.so.6] (86,915,665 samples, 0.03%)[libc.so.6] (86,915,665 samples, 0.03%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (475,982,824 samples, 0.15%)alloc::alloc::Global::alloc_impl (475,982,824 samples, 0.15%)alloc::alloc::alloc (475,982,824 samples, 0.15%)malloc (70,332,341 samples, 0.02%)core::intrinsics::unlikely (314,495,976 samples, 0.10%)alloc::vec::Vec<T>::with_capacity (1,253,955,946 samples, 0.39%)alloc::vec::Vec<T,A>::with_capacity_in (1,253,955,946 samples, 0.39%)alloc::raw_vec::RawVec<T,A>::with_capacity_in (1,253,955,946 samples, 0.39%)alloc::raw_vec::RawVecInner<A>::with_capacity_in (1,253,955,946 samples, 0.39%)alloc::raw_vec::RawVecInner<A>::try_allocate_in (1,253,955,946 samples, 0.39%)alloc::raw_vec::layout_array (761,420,870 samples, 0.24%)core::alloc::layout::Layout::repeat (761,420,870 samples, 0.24%)core::alloc::layout::Layout::repeat_packed (761,420,870 samples, 0.24%)core::num::<impl usize>::checked_mul (761,420,870 samples, 0.24%)core::num::<impl usize>::overflowing_mul (446,924,894 samples, 0.14%)core::cmp::max (202,785,664 samples, 0.06%)core::cmp::Ord::max (202,785,664 samples, 0.06%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (6,465,092,908 samples, 2.00%)<..<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (6,088,589,477 samples, 1.88%)<..core::num::<impl usize>::saturating_add (91,040,682 samples, 0.03%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,alloc::vec::into_iter::IntoIter<T>>>::from_iter (140,717,350 samples, 0.04%)[libc.so.6] (45,435,154 samples, 0.01%)[libc.so.6] (45,435,154 samples, 0.01%)alloc::boxed::Box<T>::new (57,847,356 samples, 0.02%)alloc::alloc::exchange_malloc (49,564,559 samples, 0.02%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (49,564,559 samples, 0.02%)alloc::alloc::Global::alloc_impl (49,564,559 samples, 0.02%)alloc::alloc::alloc (49,564,559 samples, 0.02%)<rsprocess::process::Process as rsprocess::process::BasicProcess>::concat (66,131,266 samples, 0.02%)alloc::sync::Arc<T>::new (61,991,641 samples, 0.02%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::first_leaf_edge (301,960,829 samples, 0.09%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::force (202,622,820 samples, 0.06%)alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,NodeType>,alloc::collections::btree::node::marker::Edge>::right_kv (115,810,229 samples, 0.04%)alloc::collections::btree::set::BTreeSet<T,A>::first (512,911,780 samples, 0.16%)alloc::collections::btree::map::BTreeMap<K,V,A>::first_key_value (512,911,780 samples, 0.16%)core::option::Option<T>::as_ref (95,140,722 samples, 0.03%)alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::Internal>,alloc::collections::btree::node::marker::Edge>::descend (90,934,947 samples, 0.03%)core::mem::maybe_uninit::MaybeUninit<T>::assume_init_read (90,934,947 samples, 0.03%)core::ptr::const_ptr::<impl *const T>::read (90,934,947 samples, 0.03%)core::ptr::read (90,934,947 samples, 0.03%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,Type>::last_edge (430,326,929 samples, 0.13%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,Type>::len (430,326,929 samples, 0.13%)alloc::collections::btree::set::BTreeSet<T,A>::last (984,314,382 samples, 0.30%)alloc::collections::btree::map::BTreeMap<K,V,A>::last_key_value (984,314,382 samples, 0.30%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::last_leaf_edge (984,314,382 samples, 0.30%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::force (438,218,404 samples, 0.14%)<rsprocess::set::Set as rsprocess::set::BasicSet>::is_subset (2,270,730,155 samples, 0.70%)alloc::collections::btree::set::BTreeSet<T,A>::is_subset (2,175,498,492 samples, 0.67%)alloc::collections::btree::set::BTreeSet<T,A>::len (74,491,720 samples, 0.02%)alloc::collections::btree::map::BTreeMap<K,V,A>::len (74,491,720 samples, 0.02%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,Type>::last_edge (37,242,628 samples, 0.01%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,Type>::len (37,242,628 samples, 0.01%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::last_leaf_edge (70,336,611 samples, 0.02%)alloc::collections::btree::set::BTreeSet<T,A>::difference (198,569,822 samples, 0.06%)alloc::collections::btree::set::BTreeSet<T,A>::last (74,477,396 samples, 0.02%)alloc::collections::btree::map::BTreeMap<K,V,A>::last_key_value (74,477,396 samples, 0.02%)<rsprocess::set::Set as rsprocess::set::BasicSet>::subtraction (303,850,177 samples, 0.09%)<alloc::sync::Arc<T,A> as core::clone::Clone>::clone (45,531,316 samples, 0.01%)<rsprocess::system::System as core::clone::Clone>::clone (144,088,342 samples, 0.04%)<rsprocess::set::Set as core::clone::Clone>::clone (70,244,165 samples, 0.02%)<alloc::collections::btree::set::BTreeSet<T,A> as core::clone::Clone>::clone (70,244,165 samples, 0.02%)<alloc::collections::btree::map::BTreeMap<K,V,A> as core::clone::Clone>::clone (57,893,017 samples, 0.02%)<alloc::collections::btree::map::BTreeMap<K,V,A> as core::clone::Clone>::clone::clone_subtree (57,893,017 samples, 0.02%)core::iter::adapters::peekable::Peekable<I>::peek (41,328,682 samples, 0.01%)core::option::Option<T>::get_or_insert_with (41,328,682 samples, 0.01%)<alloc::collections::btree::set::Difference<T,A> as core::iter::traits::iterator::Iterator>::next (82,698,743 samples, 0.03%)<T as rsprocess::set::ExtensionsSet>::iter (37,275,131 samples, 0.01%)<&rsprocess::set::Set as core::iter::traits::collect::IntoIterator>::into_iter (37,275,131 samples, 0.01%)alloc::collections::btree::set::BTreeSet<T,A>::iter (37,275,131 samples, 0.01%)alloc::collections::btree::map::BTreeMap<K,V,A>::keys (37,275,131 samples, 0.01%)alloc::collections::btree::map::BTreeMap<K,V,A>::iter (37,275,131 samples, 0.01%)<rsprocess::set::Set as rsprocess::set::BasicSet>::union (148,783,976 samples, 0.05%)core::iter::traits::iterator::Iterator::collect (107,385,197 samples, 0.03%)<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (107,385,197 samples, 0.03%)<I as core::iter::traits::collect::IntoIterator>::into_iter (107,385,197 samples, 0.03%)<alloc::collections::btree::map::BTreeMap<K,V,A> as core::iter::traits::collect::IntoIterator>::into_iter (99,376,079 samples, 0.03%)core::mem::drop (4,584,961,852 samples, 1.42%)core::ptr::drop_in_place<alloc::collections::btree::map::IntoIter<u32,alloc::collections::btree::set_val::SetValZST>> (4,584,961,852 samples, 1.42%)<alloc::collections::btree::map::IntoIter<K,V,A> as core::ops::drop::Drop>::drop (4,584,961,852 samples, 1.42%)<rsprocess::transitions::TransitionsIterator<rsprocess::set::Set,rsprocess::system::System,rsprocess::process::Process> as core::iter::traits::iterator::Iterator>::next::{{closure}} (5,453,881,876 samples, 1.69%)core::ptr::drop_in_place<rsprocess::set::Set> (4,688,483,344 samples, 1.45%)core::ptr::drop_in_place<alloc::collections::btree::set::BTreeSet<u32>> (4,688,483,344 samples, 1.45%)core::ptr::drop_in_place<alloc::collections::btree::map::BTreeMap<u32,alloc::collections::btree::set_val::SetValZST>> (4,688,483,344 samples, 1.45%)<alloc::collections::btree::map::BTreeMap<K,V,A> as core::ops::drop::Drop>::drop (4,688,483,344 samples, 1.45%)<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::fold (5,627,490,423 samples, 1.74%)core::num::<impl usize>::unchecked_add (99,340,072 samples, 0.03%)<rsprocess::transitions::TransitionsIterator<rsprocess::set::Set,rsprocess::system::System,rsprocess::process::Process> as core::iter::traits::iterator::Iterator>::next (5,685,372,936 samples, 1.76%)<std::hash::random::DefaultHasher as core::hash::Hasher>::write (48,858,376 samples, 0.02%)<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (48,858,376 samples, 0.02%)<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (48,858,376 samples, 0.02%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (103,152,961 samples, 0.03%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (103,152,961 samples, 0.03%)<core::iter::adapters::copied::Copied<I> as core::iter::traits::iterator::Iterator>::size_hint (99,013,784 samples, 0.03%)<alloc::collections::btree::set::Difference<T,A> as core::iter::traits::iterator::Iterator>::size_hint (99,013,784 samples, 0.03%)core::iter::traits::exact_size::ExactSizeIterator::len (53,796,247 samples, 0.02%)<core::iter::adapters::peekable::Peekable<I> as core::iter::traits::iterator::Iterator>::size_hint (53,796,247 samples, 0.02%)[libc.so.6] (128,007,427 samples, 0.04%)alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,NodeType>,alloc::collections::btree::node::marker::Edge>::right_kv (322,822,717 samples, 0.10%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,Type>::len (41,294,612 samples, 0.01%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::next_kv (339,366,719 samples, 0.10%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>,alloc::collections::btree::node::marker::KV>>::next_leaf_edge (53,643,823 samples, 0.02%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Immut,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::next_unchecked::{{closure}} (566,614,185 samples, 0.18%)alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Immut,K,V,NodeType>,alloc::collections::btree::node::marker::KV>::into_kv (173,603,643 samples, 0.05%)core::slice::<impl [T]>::get_unchecked (169,482,250 samples, 0.05%)<usize as core::slice::index::SliceIndex<[T]>>::get_unchecked (169,482,250 samples, 0.05%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Immut,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::next_unchecked (1,021,476,244 samples, 0.32%)alloc::collections::btree::mem::replace (1,021,476,244 samples, 0.32%)core::ptr::write (454,862,059 samples, 0.14%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::first_leaf_edge (66,128,134 samples, 0.02%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::force (49,578,297 samples, 0.02%)<alloc::collections::btree::map::Iter<K,V> as core::iter::traits::iterator::Iterator>::next (1,629,588,043 samples, 0.50%)alloc::collections::btree::navigate::LazyLeafRange<alloc::collections::btree::node::marker::Immut,K,V>::next_unchecked (1,422,774,897 samples, 0.44%)alloc::collections::btree::navigate::LazyLeafRange<BorrowType,K,V>::init_front (401,298,653 samples, 0.12%)<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (41,380,907 samples, 0.01%)alloc::collections::btree::map::BTreeMap<K,V,A>::bulk_build_from_sorted_iter (41,368,683 samples, 0.01%)core::hash::BuildHasher::hash_one (74,515,981 samples, 0.02%)core::hash::impls::<impl core::hash::Hash for &T>::hash (53,811,797 samples, 0.02%)<rsprocess::system::System as core::hash::Hash>::hash (53,811,797 samples, 0.02%)<rsprocess::set::Set as core::hash::Hash>::hash (53,811,797 samples, 0.02%)<alloc::collections::btree::set::BTreeSet<T,A> as core::hash::Hash>::hash (53,811,797 samples, 0.02%)<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (53,811,797 samples, 0.02%)[unknown] (1,960,443,242 samples, 0.61%)core::slice::sort::stable::drift::sort (90,930,580 samples, 0.03%)__rustc::__rust_alloc (256,132,170 samples, 0.08%)__rustc::__rust_dealloc (1,783,153,380 samples, 0.55%)alloc::collections::btree::append::<impl alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Owned,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::bulk_push (161,406,899 samples, 0.05%)alloc::collections::btree::fix::<impl alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Owned,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::fix_right_border_of_plentiful (293,675,599 samples, 0.09%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::force (91,118,386 samples, 0.03%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (852,053,616 samples, 0.26%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (852,053,616 samples, 0.26%)alloc::vec::Vec<T>::with_capacity (852,053,616 samples, 0.26%)alloc::vec::Vec<T,A>::with_capacity_in (852,053,616 samples, 0.26%)alloc::raw_vec::RawVec<T,A>::with_capacity_in (852,053,616 samples, 0.26%)alloc::raw_vec::RawVecInner<A>::with_capacity_in (852,053,616 samples, 0.26%)alloc::raw_vec::RawVecInner<A>::try_allocate_in (852,053,616 samples, 0.26%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (769,248,874 samples, 0.24%)alloc::alloc::Global::alloc_impl (769,248,874 samples, 0.24%)alloc::alloc::alloc (769,248,874 samples, 0.24%)malloc (760,961,741 samples, 0.24%)alloc::collections::btree::dedup_sorted_iter::DedupSortedIter<K,V,I>::new (9,810,733,974 samples, 3.03%)all..core::iter::traits::iterator::Iterator::peekable (479,055,436 samples, 0.15%)core::iter::adapters::peekable::Peekable<I>::new (479,055,436 samples, 0.15%)[libc.so.6] (103,310,902 samples, 0.03%)[libc.so.6] (655,047,599 samples, 0.20%)[libc.so.6] (530,968,180 samples, 0.16%)[unknown] (125,644,379 samples, 0.04%)[unknown] (125,644,379 samples, 0.04%)[unknown] (121,501,729 samples, 0.04%)[unknown] (121,501,729 samples, 0.04%)[unknown] (117,361,680 samples, 0.04%)[unknown] (84,225,340 samples, 0.03%)[unknown] (75,943,908 samples, 0.02%)[unknown] (62,069,001 samples, 0.02%)[unknown] (57,959,337 samples, 0.02%)[unknown] (45,538,804 samples, 0.01%)[unknown] (45,538,804 samples, 0.01%)__rustc::__rust_no_alloc_shim_is_unstable_v2 (1,030,470,825 samples, 0.32%)alloc::boxed::Box<T,A>::new_uninit_in (9,604,369,480 samples, 2.97%)all..alloc::boxed::Box<T,A>::try_new_uninit_in (9,604,369,480 samples, 2.97%)all..<alloc::alloc::Global as core::alloc::Allocator>::allocate (9,604,369,480 samples, 2.97%)<al..alloc::alloc::Global::alloc_impl (9,604,369,480 samples, 2.97%)all..alloc::alloc::alloc (9,604,369,480 samples, 2.97%)all..malloc (5,511,732,043 samples, 1.70%)alloc::collections::btree::map::BTreeMap<K,V,A>::bulk_build_from_sorted_iter (20,776,046,469 samples, 6.42%)alloc::c..alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Owned,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::new (9,720,211,833 samples, 3.01%)all..alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Owned,K,V,alloc::collections::btree::node::marker::Leaf>::new_leaf (9,703,657,761 samples, 3.00%)all..alloc::collections::btree::node::LeafNode<K,V>::new (9,703,657,761 samples, 3.00%)all..alloc::collections::btree::node::LeafNode<K,V>::init (99,288,281 samples, 0.03%)core::ptr::mut_ptr::<impl *mut T>::write (99,288,281 samples, 0.03%)core::ptr::write (99,288,281 samples, 0.03%)<alloc::alloc::Global as core::alloc::Allocator>::deallocate (5,939,020,554 samples, 1.84%)<..alloc::alloc::dealloc (5,939,020,554 samples, 1.84%)a..cfree (5,740,404,386 samples, 1.77%)c..core::option::Option<T>::as_ref (223,055,138 samples, 0.07%)alloc::collections::btree::navigate::LazyLeafRange<alloc::collections::btree::node::marker::Dying,K,V>::deallocating_end (6,823,679,179 samples, 2.11%)a..alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Dying,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::deallocating_end (6,823,679,179 samples, 2.11%)a..alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Dying,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::deallocate_and_ascend (6,823,679,179 samples, 2.11%)a..alloc::collections::btree::node::NodeRef<BorrowType,K,V,Type>::ascend (727,456,729 samples, 0.22%)alloc::collections::btree::map::IntoIter<K,V,A>::dying_next (15,240,966,304 samples, 4.71%)alloc..alloc::collections::btree::navigate::LazyLeafRange<alloc::collections::btree::node::marker::Dying,K,V>::deallocating_next_unchecked (6,449,317,621 samples, 1.99%)a..alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Dying,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::deallocating_next_unchecked (6,449,317,621 samples, 1.99%)a..alloc::collections::btree::mem::replace (6,449,317,621 samples, 1.99%)a..core::ptr::write (3,584,622,607 samples, 1.11%)alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,NodeType>,alloc::collections::btree::node::marker::Edge>::right_kv (103,462,010 samples, 0.03%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,Type>::len (78,614,271 samples, 0.02%)alloc::collections::btree::set::BTreeSet<T,A>::first (215,242,316 samples, 0.07%)alloc::collections::btree::map::BTreeMap<K,V,A>::first_key_value (215,242,316 samples, 0.07%)core::option::Option<T>::as_ref (86,956,412 samples, 0.03%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,Type>::last_edge (66,226,050 samples, 0.02%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,Type>::len (66,226,050 samples, 0.02%)alloc::collections::btree::set::BTreeSet<T,A>::last (86,914,746 samples, 0.03%)alloc::collections::btree::map::BTreeMap<K,V,A>::last_key_value (86,914,746 samples, 0.03%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::last_leaf_edge (86,914,746 samples, 0.03%)alloc::collections::btree::set::BTreeSet<T,A>::intersection (989,026,499 samples, 0.31%)core::ptr::drop_in_place<petgraph::graph_impl::Graph<alloc::string::String,alloc::string::String>> (409,098,618 samples, 0.13%)core::ptr::drop_in_place<alloc::vec::Vec<petgraph::graph_impl::Node<alloc::string::String>>> (409,098,618 samples, 0.13%)core::ptr::drop_in_place<alloc::raw_vec::RawVec<petgraph::graph_impl::Node<alloc::string::String>>> (409,098,618 samples, 0.13%)<alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop (409,098,618 samples, 0.13%)alloc::raw_vec::RawVecInner<A>::deallocate (409,098,618 samples, 0.13%)<alloc::alloc::Global as core::alloc::Allocator>::deallocate (409,098,618 samples, 0.13%)alloc::alloc::dealloc (409,098,618 samples, 0.13%)[libc.so.6] (409,098,618 samples, 0.13%)[libc.so.6] (409,098,618 samples, 0.13%)[libc.so.6] (409,098,618 samples, 0.13%)[libc.so.6] (252,049,690 samples, 0.08%)[libc.so.6] (161,179,500 samples, 0.05%)[libc.so.6] (128,152,370 samples, 0.04%)[libc.so.6] (78,846,114 samples, 0.02%)core::ptr::drop_in_place<rsprocess::label::Label> (289,427,606 samples, 0.09%)core::ptr::drop_in_place<rsprocess::set::Set> (268,854,142 samples, 0.08%)core::ptr::drop_in_place<alloc::collections::btree::set::BTreeSet<u32>> (268,854,142 samples, 0.08%)core::ptr::drop_in_place<alloc::collections::btree::map::BTreeMap<u32,alloc::collections::btree::set_val::SetValZST>> (268,854,142 samples, 0.08%)cfree (99,406,621 samples, 0.03%)<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (41,394,504 samples, 0.01%)core::ptr::drop_in_place<[alloc::sync::Arc<rsprocess::process::Process>]> (41,394,504 samples, 0.01%)core::ptr::drop_in_place<alloc::sync::Arc<rsprocess::process::Process>> (41,394,504 samples, 0.01%)<alloc::sync::Arc<T,A> as core::ops::drop::Drop>::drop (41,394,504 samples, 0.01%)core::ptr::drop_in_place<rsprocess::process::Process> (49,668,312 samples, 0.02%)core::ptr::drop_in_place<alloc::vec::Vec<alloc::sync::Arc<rsprocess::process::Process>>> (45,530,112 samples, 0.01%)core::ptr::drop_in_place<rsprocess::system::System> (72,615,925 samples, 0.02%)core::slice::sort::stable::drift::sort (310,299,512 samples, 0.10%)core::slice::sort::stable::drift::merge_tree_depth (45,524,152 samples, 0.01%)core::cmp::min (33,110,707 samples, 0.01%)core::cmp::Ord::min (33,110,707 samples, 0.01%)core::cmp::min (45,533,246 samples, 0.01%)core::cmp::Ord::min (45,533,246 samples, 0.01%)core::slice::sort::shared::find_existing_run (1,541,971,515 samples, 0.48%)core::ops::function::FnMut::call_mut (467,187,387 samples, 0.14%)core::cmp::impls::<impl core::cmp::PartialOrd for u32>::lt (467,187,387 samples, 0.14%)core::slice::sort::stable::drift::create_run (2,968,775,900 samples, 0.92%)core::slice::sort::stable::quicksort::quicksort (421,801,474 samples, 0.13%)<T as core::slice::sort::shared::smallsort::StableSmallSortTypeImpl>::small_sort (310,363,147 samples, 0.10%)core::slice::sort::shared::smallsort::small_sort_general_with_scratch (53,785,468 samples, 0.02%)core::ptr::copy_nonoverlapping (372,250,988 samples, 0.12%)[libc.so.6] (235,790,325 samples, 0.07%)core::ptr::drop_in_place<core::slice::sort::stable::merge::MergeState<u32>> (794,271,451 samples, 0.25%)<core::slice::sort::stable::merge::MergeState<T> as core::ops::drop::Drop>::drop (794,271,451 samples, 0.25%)core::ptr::copy_nonoverlapping (794,271,451 samples, 0.25%)[libc.so.6] (367,986,897 samples, 0.11%)core::ops::function::FnMut::call_mut (512,853,784 samples, 0.16%)core::cmp::impls::<impl core::cmp::PartialOrd for u32>::lt (512,853,784 samples, 0.16%)core::ptr::copy_nonoverlapping (1,606,614,288 samples, 0.50%)core::slice::sort::stable::drift::logical_merge (9,167,107,811 samples, 2.83%)co..core::slice::sort::stable::merge::merge (9,092,742,026 samples, 2.81%)co..core::slice::sort::stable::merge::MergeState<T>::merge_down (7,826,964,847 samples, 2.42%)co..core::ptr::mut_ptr::<impl *mut T>::add (1,567,797,449 samples, 0.48%)core::slice::sort::stable::drift::merge_tree_depth (607,841,406 samples, 0.19%)core::num::<impl u64>::leading_zeros (529,061,347 samples, 0.16%)core::slice::sort::stable::driftsort_main (16,678,067,119 samples, 5.16%)core::..core::slice::sort::stable::drift::sort (16,177,909,304 samples, 5.00%)core::..core::slice::sort::stable::drift::merge_tree_scale_factor (1,671,309,374 samples, 0.52%)core::num::<impl u64>::div_ceil (1,671,309,374 samples, 0.52%)core::slice::sort::stable::quicksort::quicksort (33,100,946 samples, 0.01%)<T as alloc::string::ToString>::to_string (49,660,775 samples, 0.02%)<str as alloc::string::SpecToString>::spec_to_string (49,660,775 samples, 0.02%)<alloc::string::String as core::convert::From<&str>>::from (49,660,775 samples, 0.02%)alloc::str::<impl alloc::borrow::ToOwned for str>::to_owned (49,660,775 samples, 0.02%)alloc::slice::<impl alloc::borrow::ToOwned for [T]>::to_owned (49,660,775 samples, 0.02%)alloc::slice::<impl [T]>::to_vec (49,660,775 samples, 0.02%)alloc::slice::<impl [T]>::to_vec_in (49,660,775 samples, 0.02%)<T as alloc::slice::<impl [T]>::to_vec_in::ConvertVec>::to_vec (49,660,775 samples, 0.02%)alloc::vec::Vec<T,A>::with_capacity_in (49,660,775 samples, 0.02%)alloc::raw_vec::RawVec<T,A>::with_capacity_in (49,660,775 samples, 0.02%)alloc::raw_vec::RawVecInner<A>::with_capacity_in (49,660,775 samples, 0.02%)alloc::raw_vec::RawVecInner<A>::try_allocate_in (49,660,775 samples, 0.02%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (37,791,206 samples, 0.01%)alloc::alloc::Global::alloc_impl (37,791,206 samples, 0.01%)alloc::alloc::alloc (37,791,206 samples, 0.01%)[analysis] (53,700,710 samples, 0.02%)rsprocess::graph::edge_formatter_base_color (53,700,710 samples, 0.02%)<alloc::string::String as core::fmt::Write>::write_str (37,277,403 samples, 0.01%)alloc::string::String::push_str (37,277,403 samples, 0.01%)alloc::vec::Vec<T,A>::extend_from_slice (37,277,403 samples, 0.01%)<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<&T,core::slice::iter::Iter<T>>>::spec_extend (37,277,403 samples, 0.01%)alloc::vec::Vec<T,A>::append_elements (37,277,403 samples, 0.01%)core::fmt::rt::Argument::fmt (105,250,603 samples, 0.03%)core::fmt::num::imp::<impl core::fmt::Display for u64>::fmt (64,302,104 samples, 0.02%)core::fmt::Formatter::write_fmt (221,013,584 samples, 0.07%)core::fmt::write (179,766,170 samples, 0.06%)alloc::fmt::format (349,519,943 samples, 0.11%)core::option::Option<T>::map_or_else (349,519,943 samples, 0.11%)alloc::fmt::format::{{closure}} (349,519,943 samples, 0.11%)alloc::fmt::format::format_inner (295,819,233 samples, 0.09%)core::fmt::Write::write_fmt (295,819,233 samples, 0.09%)<&mut W as core::fmt::Write::write_fmt::SpecWriteFmt>::spec_write_fmt (295,819,233 samples, 0.09%)core::fmt::write (295,819,233 samples, 0.09%)core::fmt::rt::Argument::fmt (295,819,233 samples, 0.09%)<rsprocess::dot::Dot<G> as core::fmt::Display>::fmt (295,819,233 samples, 0.09%)rsprocess::dot::Dot<G>::graph_fmt (295,819,233 samples, 0.09%)execution::presets::dot (353,670,547 samples, 0.11%)petgraph::graph_impl::Graph<N,E,Ty,Ix>::add_edge (49,613,068 samples, 0.02%)petgraph::graph_impl::Graph<N,E,Ty,Ix>::try_add_edge (45,464,712 samples, 0.01%)alloc::vec::Vec<T,A>::push (37,204,424 samples, 0.01%)alloc::vec::Vec<T,A>::push_mut (37,204,424 samples, 0.01%)core::ptr::write (37,204,424 samples, 0.01%)[libc.so.6] (37,204,424 samples, 0.01%)[libc.so.6] (34,802,365 samples, 0.01%)[libc.so.6] (34,802,365 samples, 0.01%)[libc.so.6] (34,802,365 samples, 0.01%)alloc::vec::Vec<T,A>::with_capacity_in (46,789,649 samples, 0.01%)alloc::raw_vec::RawVec<T,A>::with_capacity_in (46,789,649 samples, 0.01%)alloc::raw_vec::RawVecInner<A>::with_capacity_in (46,789,649 samples, 0.01%)alloc::raw_vec::RawVecInner<A>::try_allocate_in (46,789,649 samples, 0.01%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (43,001,150 samples, 0.01%)alloc::alloc::Global::alloc_impl (43,001,150 samples, 0.01%)alloc::alloc::alloc (43,001,150 samples, 0.01%)<alloc::string::String as core::clone::Clone>::clone (50,716,773 samples, 0.02%)<alloc::vec::Vec<T,A> as core::clone::Clone>::clone (50,716,773 samples, 0.02%)alloc::slice::<impl [T]>::to_vec_in (50,716,773 samples, 0.02%)<T as alloc::slice::<impl [T]>::to_vec_in::ConvertVec>::to_vec (50,716,773 samples, 0.02%)rsprocess::graph::EdgeColor::generate::{{closure}} (62,578,105 samples, 0.02%)[unknown] (94,743,165,527 samples, 29.29%)[unknown]__rustc::__rdl_alloc (902,499,526 samples, 0.28%)__rustc::__rdl_dealloc (682,798,289 samples, 0.21%)std::sys::alloc::unix::<impl core::alloc::global::GlobalAlloc for std::alloc::System>::dealloc (682,798,289 samples, 0.21%)__rustc::__rust_alloc (724,931,215 samples, 0.22%)__rustc::__rust_dealloc (1,321,992,791 samples, 0.41%)<core::iter::adapters::peekable::Peekable<I> as core::iter::traits::iterator::Iterator>::next (1,502,622,928 samples, 0.46%)<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (1,142,484,670 samples, 0.35%)<alloc::vec::into_iter::IntoIter<T,A> as core::iter::traits::iterator::Iterator>::next (1,142,484,670 samples, 0.35%)core::ptr::non_null::NonNull<T>::add (1,084,522,175 samples, 0.34%)core::option::Option<T>::as_ref (119,749,641 samples, 0.04%)<core::ptr::non_null::NonNull<T> as core::cmp::PartialEq>::eq (496,495,495 samples, 0.15%)core::ptr::non_null::NonNull<T>::add (2,307,921,422 samples, 0.71%)<alloc::collections::btree::dedup_sorted_iter::DedupSortedIter<K,V,I> as core::iter::traits::iterator::Iterator>::next (5,406,045,354 samples, 1.67%)core::iter::adapters::peekable::Peekable<I>::peek (3,506,635,217 samples, 1.08%)core::option::Option<T>::get_or_insert_with (3,386,885,576 samples, 1.05%)core::iter::adapters::peekable::Peekable<I>::peek::{{closure}} (3,386,885,576 samples, 1.05%)<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (3,386,885,576 samples, 1.05%)<alloc::vec::into_iter::IntoIter<T,A> as core::iter::traits::iterator::Iterator>::next (3,386,885,576 samples, 1.05%)core::ptr::non_null::NonNull<T>::read (302,050,282 samples, 0.09%)core::ptr::read (302,050,282 samples, 0.09%)alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::Internal>,alloc::collections::btree::node::marker::Edge>::descend (86,765,032 samples, 0.03%)core::mem::maybe_uninit::MaybeUninit<T>::assume_init_read (86,765,032 samples, 0.03%)core::ptr::const_ptr::<impl *const T>::read (86,765,032 samples, 0.03%)core::ptr::read (86,765,032 samples, 0.03%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::last_leaf_edge (652,489,669 samples, 0.20%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::force (491,148,765 samples, 0.15%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,Type>::ascend (57,904,731 samples, 0.02%)core::option::Option<T>::as_ref (49,617,720 samples, 0.02%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,Type>::len (3,866,431,983 samples, 1.20%)alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::Internal>::push (256,718,700 samples, 0.08%)core::mem::maybe_uninit::MaybeUninit<T>::write (45,547,569 samples, 0.01%)alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::Leaf>::push (1,204,208,598 samples, 0.37%)alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::Leaf>::push_with_handle (1,204,208,598 samples, 0.37%)core::mem::maybe_uninit::MaybeUninit<T>::write (724,179,297 samples, 0.22%)[libc.so.6] (115,669,582 samples, 0.04%)[libc.so.6] (541,731,120 samples, 0.17%)[libc.so.6] (458,919,476 samples, 0.14%)[unknown] (91,019,636 samples, 0.03%)[unknown] (78,624,858 samples, 0.02%)[unknown] (66,199,299 samples, 0.02%)[unknown] (66,199,299 samples, 0.02%)[unknown] (62,052,417 samples, 0.02%)[unknown] (57,932,210 samples, 0.02%)[unknown] (53,800,027 samples, 0.02%)[unknown] (53,800,027 samples, 0.02%)[unknown] (49,666,561 samples, 0.02%)[unknown] (37,245,029 samples, 0.01%)__rustc::__rust_no_alloc_shim_is_unstable_v2 (227,552,061 samples, 0.07%)alloc::boxed::Box<T,A>::new_uninit_in (2,766,238,714 samples, 0.86%)alloc::boxed::Box<T,A>::try_new_uninit_in (2,551,986,295 samples, 0.79%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (2,551,986,295 samples, 0.79%)alloc::alloc::Global::alloc_impl (2,551,986,295 samples, 0.79%)alloc::alloc::alloc (2,551,986,295 samples, 0.79%)malloc (1,419,052,312 samples, 0.44%)alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Owned,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::new (2,840,701,598 samples, 0.88%)alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Owned,K,V,alloc::collections::btree::node::marker::Leaf>::new_leaf (2,840,701,598 samples, 0.88%)alloc::collections::btree::node::LeafNode<K,V>::new (2,840,701,598 samples, 0.88%)alloc::collections::btree::node::LeafNode<K,V>::init (74,462,884 samples, 0.02%)core::ptr::mut_ptr::<impl *mut T>::write (74,462,884 samples, 0.02%)core::ptr::write (74,462,884 samples, 0.02%)[libc.so.6] (111,575,666 samples, 0.03%)[libc.so.6] (553,857,548 samples, 0.17%)[libc.so.6] (520,781,471 samples, 0.16%)[unknown] (227,376,565 samples, 0.07%)[unknown] (198,463,396 samples, 0.06%)[unknown] (194,323,049 samples, 0.06%)[unknown] (181,922,020 samples, 0.06%)[unknown] (177,777,399 samples, 0.05%)[unknown] (144,644,151 samples, 0.04%)[unknown] (119,883,469 samples, 0.04%)[unknown] (111,598,274 samples, 0.03%)[unknown] (99,175,297 samples, 0.03%)[unknown] (90,886,810 samples, 0.03%)[unknown] (90,886,810 samples, 0.03%)[unknown] (66,045,388 samples, 0.02%)__rustc::__rust_no_alloc_shim_is_unstable_v2 (177,796,209 samples, 0.05%)alloc::boxed::Box<T,A>::new_uninit_in (2,227,119,749 samples, 0.69%)alloc::boxed::Box<T,A>::try_new_uninit_in (2,181,689,055 samples, 0.67%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (2,181,689,055 samples, 0.67%)alloc::alloc::Global::alloc_impl (2,181,689,055 samples, 0.67%)alloc::alloc::alloc (2,181,689,055 samples, 0.67%)malloc (1,114,990,241 samples, 0.34%)alloc::collections::btree::node::InternalNode<K,V>::new (2,338,712,269 samples, 0.72%)alloc::collections::btree::node::LeafNode<K,V>::init (111,592,520 samples, 0.03%)core::ptr::mut_ptr::<impl *mut T>::write (111,592,520 samples, 0.03%)core::ptr::write (111,592,520 samples, 0.03%)alloc::collections::btree::mem::take_mut::{{closure}} (2,350,841,714 samples, 0.73%)alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Owned,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::push_internal_level::{{closure}} (2,350,841,714 samples, 0.73%)alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Owned,K,V,alloc::collections::btree::node::marker::Internal>::new_internal (2,350,841,714 samples, 0.73%)core::ptr::read (102,911,274 samples, 0.03%)alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Owned,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::push_internal_level (2,478,591,057 samples, 0.77%)alloc::collections::btree::mem::take_mut (2,478,591,057 samples, 0.77%)alloc::collections::btree::mem::replace (2,478,591,057 samples, 0.77%)alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,NodeType>,alloc::collections::btree::node::marker::Edge>::right_kv (53,852,766 samples, 0.02%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::next_kv (70,262,621 samples, 0.02%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Immut,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::next_unchecked::{{closure}} (119,933,305 samples, 0.04%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Immut,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::next_unchecked (198,549,657 samples, 0.06%)alloc::collections::btree::mem::replace (198,549,657 samples, 0.06%)core::ptr::write (78,616,352 samples, 0.02%)<alloc::collections::btree::map::Iter<K,V> as core::iter::traits::iterator::Iterator>::next (285,407,819 samples, 0.09%)alloc::collections::btree::navigate::LazyLeafRange<alloc::collections::btree::node::marker::Immut,K,V>::next_unchecked (252,318,896 samples, 0.08%)alloc::collections::btree::navigate::LazyLeafRange<BorrowType,K,V>::init_front (53,769,239 samples, 0.02%)[libc.so.6] (289,544,325 samples, 0.09%)<alloc::alloc::Global as core::alloc::Allocator>::deallocate (2,843,890,581 samples, 0.88%)alloc::alloc::dealloc (2,843,890,581 samples, 0.88%)cfree (2,438,584,635 samples, 0.75%)alloc::collections::btree::append::<impl alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Owned,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::bulk_push (34,601,662,429 samples, 10.70%)alloc::collectio..core::ptr::drop_in_place<alloc::collections::btree::dedup_sorted_iter::DedupSortedIter<u32,alloc::collections::btree::set_val::SetValZST,core::iter::adapters::map::Map<alloc::vec::into_iter::IntoIter<u32>,alloc::collections::btree::set::BTreeSet<u32>::from_sorted_iter<alloc::vec::into_iter::IntoIter<u32>>::{{closure}}>>> (3,162,377,144 samples, 0.98%)core::ptr::drop_in_place<core::iter::adapters::peekable::Peekable<core::iter::adapters::map::Map<alloc::vec::into_iter::IntoIter<u32>,alloc::collections::btree::set::BTreeSet<u32>::from_sorted_iter<alloc::vec::into_iter::IntoIter<u32>>::{{closure}}>>> (3,162,377,144 samples, 0.98%)core::ptr::drop_in_place<core::iter::adapters::map::Map<alloc::vec::into_iter::IntoIter<u32>,alloc::collections::btree::set::BTreeSet<u32>::from_sorted_iter<alloc::vec::into_iter::IntoIter<u32>>::{{closure}}>> (3,162,377,144 samples, 0.98%)core::ptr::drop_in_place<alloc::vec::into_iter::IntoIter<u32>> (3,162,377,144 samples, 0.98%)<alloc::vec::into_iter::IntoIter<T,A> as core::ops::drop::Drop>::drop (3,162,377,144 samples, 0.98%)core::ptr::drop_in_place<<alloc::vec::into_iter::IntoIter<T,A> as core::ops::drop::Drop>::drop::DropGuard<u32,alloc::alloc::Global>> (3,162,377,144 samples, 0.98%)<<alloc::vec::into_iter::IntoIter<T,A> as core::ops::drop::Drop>::drop::DropGuard<T,A> as core::ops::drop::Drop>::drop (3,162,377,144 samples, 0.98%)core::ptr::drop_in_place<alloc::raw_vec::RawVec<u32>> (3,162,377,144 samples, 0.98%)<alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop (3,162,377,144 samples, 0.98%)alloc::raw_vec::RawVecInner<A>::deallocate (3,162,377,144 samples, 0.98%)alloc::raw_vec::RawVecInner<A>::current_memory (318,486,563 samples, 0.10%)core::num::<impl usize>::unchecked_mul (107,437,468 samples, 0.03%)alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,NodeType>,alloc::collections::btree::node::marker::KV>::replace_kv (173,804,369 samples, 0.05%)core::mem::replace (173,804,369 samples, 0.05%)alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,Type>::key_area_mut (33,083,243 samples, 0.01%)core::slice::<impl [T]>::get_unchecked_mut (33,083,243 samples, 0.01%)<core::ops::range::Range<usize> as core::slice::index::SliceIndex<[T]>>::get_unchecked_mut (33,083,243 samples, 0.01%)core::slice::index::get_offset_len_mut_noubcheck (33,083,243 samples, 0.01%)alloc::collections::btree::node::move_to_slice (620,051,720 samples, 0.19%)core::ptr::copy_nonoverlapping (615,907,400 samples, 0.19%)[libc.so.6] (446,302,129 samples, 0.14%)core::ptr::copy (269,073,922 samples, 0.08%)[libc.so.6] (269,073,922 samples, 0.08%)alloc::collections::btree::node::slice_shr (277,336,344 samples, 0.09%)core::mem::maybe_uninit::MaybeUninit<T>::assume_init_read (41,392,820 samples, 0.01%)core::ptr::const_ptr::<impl *const T>::read (41,392,820 samples, 0.01%)core::ptr::read (41,392,820 samples, 0.01%)alloc::collections::btree::node::BalancingContext<K,V>::bulk_steal_left (1,637,893,258 samples, 0.51%)core::mem::maybe_uninit::MaybeUninit<T>::write (86,849,066 samples, 0.03%)alloc::collections::btree::node::BalancingContext<K,V>::right_child_len (608,276,978 samples, 0.19%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,Type>::len (608,276,978 samples, 0.19%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,Type>::last_kv (49,673,842 samples, 0.02%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,Type>::len (49,673,842 samples, 0.02%)alloc::collections::btree::fix::<impl alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Owned,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::fix_right_border_of_plentiful (3,359,104,654 samples, 1.04%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::force (446,722,511 samples, 0.14%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (107,548,914 samples, 0.03%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (107,548,914 samples, 0.03%)alloc::vec::Vec<T>::with_capacity (107,548,914 samples, 0.03%)alloc::vec::Vec<T,A>::with_capacity_in (107,548,914 samples, 0.03%)alloc::raw_vec::RawVec<T,A>::with_capacity_in (107,548,914 samples, 0.03%)alloc::raw_vec::RawVecInner<A>::with_capacity_in (107,548,914 samples, 0.03%)alloc::raw_vec::RawVecInner<A>::try_allocate_in (107,548,914 samples, 0.03%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (103,441,602 samples, 0.03%)alloc::alloc::Global::alloc_impl (103,441,602 samples, 0.03%)alloc::alloc::alloc (103,441,602 samples, 0.03%)malloc (99,298,772 samples, 0.03%)alloc::collections::btree::dedup_sorted_iter::DedupSortedIter<K,V,I>::new (553,765,379 samples, 0.17%)core::iter::traits::iterator::Iterator::peekable (53,816,840 samples, 0.02%)core::iter::adapters::peekable::Peekable<I>::new (53,816,840 samples, 0.02%)[libc.so.6] (144,433,542 samples, 0.04%)[libc.so.6] (123,735,331 samples, 0.04%)[unknown] (33,112,546 samples, 0.01%)[unknown] (33,112,546 samples, 0.01%)[unknown] (33,112,546 samples, 0.01%)__rustc::__rust_no_alloc_shim_is_unstable_v2 (49,671,228 samples, 0.02%)alloc::collections::btree::map::BTreeMap<K,V,A>::bulk_build_from_sorted_iter (4,024,078,083 samples, 1.24%)alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Owned,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::new (1,612,461,989 samples, 0.50%)alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Owned,K,V,alloc::collections::btree::node::marker::Leaf>::new_leaf (1,608,325,113 samples, 0.50%)alloc::collections::btree::node::LeafNode<K,V>::new (1,608,325,113 samples, 0.50%)alloc::boxed::Box<T,A>::new_uninit_in (1,608,325,113 samples, 0.50%)alloc::boxed::Box<T,A>::try_new_uninit_in (558,179,402 samples, 0.17%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (558,179,402 samples, 0.17%)alloc::alloc::Global::alloc_impl (558,179,402 samples, 0.17%)alloc::alloc::alloc (558,179,402 samples, 0.17%)malloc (240,008,156 samples, 0.07%)alloc::collections::btree::set::BTreeSet<T,A>::first (124,118,640 samples, 0.04%)alloc::collections::btree::map::BTreeMap<K,V,A>::first_key_value (124,118,640 samples, 0.04%)core::option::Option<T>::as_ref (115,828,986 samples, 0.04%)<rsprocess::set::Set as rsprocess::set::BasicSet>::is_subset (591,369,406 samples, 0.18%)alloc::collections::btree::set::BTreeSet<T,A>::is_subset (591,369,406 samples, 0.18%)[libc.so.6] (111,117,931 samples, 0.03%)<alloc::alloc::Global as core::alloc::Allocator>::deallocate (2,380,966,609 samples, 0.74%)alloc::alloc::dealloc (2,380,966,609 samples, 0.74%)cfree (1,595,677,481 samples, 0.49%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Dying,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::deallocating_end (2,451,390,224 samples, 0.76%)alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Dying,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::deallocate_and_ascend (2,451,390,224 samples, 0.76%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,Type>::ascend (58,005,510 samples, 0.02%)<core::option::Option<T> as core::ops::try_trait::Try>::branch (794,444,390 samples, 0.25%)alloc::collections::btree::navigate::LazyLeafRange<alloc::collections::btree::node::marker::Dying,K,V>::deallocating_end (4,787,660,912 samples, 1.48%)alloc::collections::btree::navigate::LazyLeafRange<alloc::collections::btree::node::marker::Dying,K,V>::take_front (2,336,270,688 samples, 0.72%)core::option::Option<T>::take (1,533,542,268 samples, 0.47%)core::mem::replace (1,533,542,268 samples, 0.47%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::first_leaf_edge (136,354,947 samples, 0.04%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>,alloc::collections::btree::node::marker::KV>>::next_leaf_edge (653,853,337 samples, 0.20%)alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>,Type>::force (372,542,756 samples, 0.12%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::force (372,542,756 samples, 0.12%)alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,NodeType>,alloc::collections::btree::node::marker::Edge>::right_kv (5,252,267,374 samples, 1.62%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,Type>::len (160,928,247 samples, 0.05%)[libc.so.6] (45,621,940 samples, 0.01%)<alloc::alloc::Global as core::alloc::Allocator>::deallocate (2,149,438,537 samples, 0.66%)alloc::alloc::dealloc (2,149,438,537 samples, 0.66%)cfree (2,099,676,790 samples, 0.65%)core::option::Option<T>::as_ref (132,394,411 samples, 0.04%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Dying,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::deallocating_next_unchecked::{{closure}} (9,764,162,119 samples, 3.02%)all..alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Dying,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::deallocating_next (9,764,162,119 samples, 3.02%)all..alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Dying,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::deallocate_and_ascend (2,459,772,032 samples, 0.76%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,Type>::ascend (215,145,734 samples, 0.07%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Dying,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::deallocating_next_unchecked (11,097,999,962 samples, 3.43%)all..alloc::collections::btree::mem::replace (11,097,999,962 samples, 3.43%)all..core::ptr::write (533,292,093 samples, 0.16%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::first_leaf_edge (512,685,034 samples, 0.16%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::force (429,887,813 samples, 0.13%)alloc::collections::btree::map::IntoIter<K,V,A>::dying_next (37,418,928,123 samples, 11.57%)alloc::collection..alloc::collections::btree::navigate::LazyLeafRange<alloc::collections::btree::node::marker::Dying,K,V>::deallocating_next_unchecked (14,088,886,528 samples, 4.36%)alloc..alloc::collections::btree::navigate::LazyLeafRange<BorrowType,K,V>::init_front (2,990,886,566 samples, 0.92%)core::ptr::read (182,129,202 samples, 0.06%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::first_leaf_edge (273,265,861 samples, 0.08%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::force (264,974,675 samples, 0.08%)core::option::Option<T>::as_ref (434,239,159 samples, 0.13%)alloc::collections::btree::set::BTreeSet<T,A>::first (1,182,901,648 samples, 0.37%)alloc::collections::btree::map::BTreeMap<K,V,A>::first_key_value (1,182,901,648 samples, 0.37%)core::option::Option<T>::map (446,428,400 samples, 0.14%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,Type>::last_edge (401,408,920 samples, 0.12%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,Type>::len (401,408,920 samples, 0.12%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::last_leaf_edge (653,493,611 samples, 0.20%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::force (231,432,831 samples, 0.07%)alloc::collections::btree::map::BTreeMap<K,V,A>::last_key_value (839,562,991 samples, 0.26%)core::option::Option<T>::map (186,069,380 samples, 0.06%)core::ops::function::FnOnce::call_once (186,069,380 samples, 0.06%)alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Immut,K,V,NodeType>,alloc::collections::btree::node::marker::KV>::into_kv (186,069,380 samples, 0.06%)core::slice::<impl [T]>::get_unchecked (186,069,380 samples, 0.06%)<usize as core::slice::index::SliceIndex<[T]>>::get_unchecked (186,069,380 samples, 0.06%)alloc::collections::btree::set::BTreeSet<T,A>::intersection (2,179,247,967 samples, 0.67%)alloc::collections::btree::set::BTreeSet<T,A>::last (847,833,543 samples, 0.26%)[libc.so.6] (144,998,056 samples, 0.04%)alloc::raw_vec::finish_grow (264,318,300 samples, 0.08%)<alloc::alloc::Global as core::alloc::Allocator>::grow (260,595,441 samples, 0.08%)alloc::alloc::Global::grow_impl (260,595,441 samples, 0.08%)alloc::alloc::realloc (260,595,441 samples, 0.08%)realloc (260,595,441 samples, 0.08%)[libc.so.6] (256,695,673 samples, 0.08%)[libc.so.6] (256,695,673 samples, 0.08%)core::ptr::drop_in_place<alloc::vec::Vec<petgraph::graph_impl::Edge<rsprocess::label::Label>>> (45,696,134 samples, 0.01%)<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (45,696,134 samples, 0.01%)core::ptr::drop_in_place<[petgraph::graph_impl::Edge<rsprocess::label::Label>]> (45,696,134 samples, 0.01%)alloc::collections::btree::map::IntoIter<K,V,A>::dying_next (45,696,134 samples, 0.01%)core::ptr::drop_in_place<petgraph::graph_impl::Graph<rsprocess::system::System,rsprocess::label::Label>> (86,171,854 samples, 0.03%)core::ptr::drop_in_place<alloc::vec::Vec<petgraph::graph_impl::Node<rsprocess::system::System>>> (40,475,720 samples, 0.01%)core::ptr::drop_in_place<alloc::raw_vec::RawVec<petgraph::graph_impl::Node<rsprocess::system::System>>> (40,475,720 samples, 0.01%)<alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop (40,475,720 samples, 0.01%)alloc::raw_vec::RawVecInner<A>::deallocate (40,475,720 samples, 0.01%)<alloc::alloc::Global as core::alloc::Allocator>::deallocate (40,475,720 samples, 0.01%)alloc::alloc::dealloc (40,475,720 samples, 0.01%)[libc.so.6] (40,475,720 samples, 0.01%)[libc.so.6] (40,475,720 samples, 0.01%)[libc.so.6] (40,475,720 samples, 0.01%)core::ptr::drop_in_place<rsprocess::process::Process> (33,125,023 samples, 0.01%)core::ptr::drop_in_place<alloc::vec::Vec<alloc::sync::Arc<rsprocess::process::Process>>> (33,125,023 samples, 0.01%)alloc::sync::Arc<T,A>::drop_slow (165,853,537 samples, 0.05%)<core::iter::adapters::peekable::Peekable<I> as core::iter::traits::iterator::Iterator>::size_hint (78,685,427 samples, 0.02%)core::num::<impl usize>::checked_add (78,685,427 samples, 0.02%)core::intrinsics::unlikely (78,685,427 samples, 0.02%)core::iter::traits::exact_size::ExactSizeIterator::len (240,002,054 samples, 0.07%)<core::option::Option<T> as core::cmp::PartialEq>::eq (49,669,001 samples, 0.02%)<core::iter::adapters::copied::Copied<I> as core::iter::traits::iterator::Iterator>::size_hint (289,572,303 samples, 0.09%)<alloc::collections::btree::set::Difference<T,A> as core::iter::traits::iterator::Iterator>::size_hint (289,572,303 samples, 0.09%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (1,629,013,462 samples, 0.50%)alloc::alloc::Global::alloc_impl (1,629,013,462 samples, 0.50%)alloc::alloc::alloc (1,629,013,462 samples, 0.50%)malloc (1,401,495,710 samples, 0.43%)__rustc::__rust_no_alloc_shim_is_unstable_v2 (144,821,841 samples, 0.04%)core::intrinsics::unlikely (291,813,719 samples, 0.09%)alloc::vec::Vec<T>::with_capacity (2,413,067,857 samples, 0.75%)alloc::vec::Vec<T,A>::with_capacity_in (2,413,067,857 samples, 0.75%)alloc::raw_vec::RawVec<T,A>::with_capacity_in (2,413,067,857 samples, 0.75%)alloc::raw_vec::RawVecInner<A>::with_capacity_in (2,413,067,857 samples, 0.75%)alloc::raw_vec::RawVecInner<A>::try_allocate_in (2,413,067,857 samples, 0.75%)alloc::raw_vec::layout_array (556,425,203 samples, 0.17%)core::alloc::layout::Layout::repeat (556,425,203 samples, 0.17%)core::alloc::layout::Layout::repeat_packed (556,425,203 samples, 0.17%)core::num::<impl usize>::checked_mul (556,425,203 samples, 0.17%)core::num::<impl usize>::overflowing_mul (264,611,484 samples, 0.08%)core::cmp::max (124,217,710 samples, 0.04%)core::cmp::Ord::max (124,217,710 samples, 0.04%)anon.a8034a099c7bdf771447e28c89ac7fdd.1.llvm.13230301628104807196 (3,100,044,287 samples, 0.96%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (3,100,044,287 samples, 0.96%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (3,100,044,287 samples, 0.96%)core::num::<impl usize>::saturating_add (132,509,162 samples, 0.04%)core::mem::drop (136,905,036 samples, 0.04%)core::ptr::drop_in_place<alloc::collections::btree::map::IntoIter<u32,alloc::collections::btree::set_val::SetValZST>> (136,905,036 samples, 0.04%)<alloc::collections::btree::map::IntoIter<K,V,A> as core::ops::drop::Drop>::drop (136,905,036 samples, 0.04%)core::ptr::drop_in_place<petgraph::graph_impl::Edge<rsprocess::label::Label>> (153,476,566 samples, 0.05%)core::ptr::drop_in_place<rsprocess::label::Label> (153,476,566 samples, 0.05%)core::ptr::drop_in_place<rsprocess::set::Set> (153,476,566 samples, 0.05%)core::ptr::drop_in_place<alloc::collections::btree::set::BTreeSet<u32>> (153,476,566 samples, 0.05%)core::ptr::drop_in_place<alloc::collections::btree::map::BTreeMap<u32,alloc::collections::btree::set_val::SetValZST>> (153,476,566 samples, 0.05%)<alloc::collections::btree::map::BTreeMap<K,V,A> as core::ops::drop::Drop>::drop (153,476,566 samples, 0.05%)<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (41,330,364 samples, 0.01%)core::ptr::drop_in_place<[alloc::sync::Arc<rsprocess::process::Process>]> (41,330,364 samples, 0.01%)core::ptr::drop_in_place<alloc::sync::Arc<rsprocess::process::Process>> (41,330,364 samples, 0.01%)<alloc::sync::Arc<T,A> as core::ops::drop::Drop>::drop (41,330,364 samples, 0.01%)core::ptr::drop_in_place<rsprocess::process::Process> (53,766,621 samples, 0.02%)core::ptr::drop_in_place<alloc::vec::Vec<alloc::sync::Arc<rsprocess::process::Process>>> (45,480,073 samples, 0.01%)<usize as core::iter::range::Step>::forward_unchecked (45,544,698 samples, 0.01%)core::num::<impl usize>::unchecked_add (45,544,698 samples, 0.01%)core::iter::range::<impl core::iter::traits::iterator::Iterator for core::ops::range::Range<A>>::next (86,914,592 samples, 0.03%)<core::ops::range::Range<T> as core::iter::range::RangeIteratorImpl>::spec_next (86,914,592 samples, 0.03%)core::cmp::impls::<impl core::cmp::PartialOrd for usize>::lt (41,369,894 samples, 0.01%)core::slice::sort::shared::smallsort::merge_down (107,523,340 samples, 0.03%)core::slice::sort::shared::smallsort::small_sort_general_with_scratch (741,386,678 samples, 0.23%)core::slice::sort::shared::smallsort::bidirectional_merge (318,453,117 samples, 0.10%)core::slice::sort::shared::smallsort::merge_up (57,868,722 samples, 0.02%)core::ptr::copy_nonoverlapping (33,016,963 samples, 0.01%)core::slice::sort::stable::drift::DriftsortRun::len (57,939,414 samples, 0.02%)core::slice::sort::stable::drift::sort (587,359,039 samples, 0.18%)core::slice::sort::stable::drift::merge_tree_depth (301,815,252 samples, 0.09%)core::slice::sort::stable::driftsort_main (260,895,160 samples, 0.08%)core::slice::sort::stable::quicksort::quicksort (144,711,650 samples, 0.04%)[libc.so.6] (399,668,677 samples, 0.12%)[libc.so.6] (399,668,677 samples, 0.12%)[libc.so.6] (399,668,677 samples, 0.12%)[libc.so.6] (251,857,951 samples, 0.08%)execution::presets::run (399,673,467 samples, 0.12%)execution::presets::execute (399,673,467 samples, 0.12%)core::ptr::drop_in_place<rsprocess::system::System> (37,227,642 samples, 0.01%)hashbrown::rustc_entry::<impl hashbrown::map::HashMap<K,V,S,A>>::rustc_entry (70,184,000 samples, 0.02%)petgraph::graph_impl::Graph<N,E,Ty,Ix>::map (42,340,328 samples, 0.01%)<alloc::vec::Vec<T,A> as core::iter::traits::collect::Extend<T>>::extend (42,340,328 samples, 0.01%)<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (42,340,328 samples, 0.01%)alloc::vec::Vec<T,A>::extend_trusted (42,340,328 samples, 0.01%)core::iter::traits::iterator::Iterator::for_each (42,340,328 samples, 0.01%)<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold (42,340,328 samples, 0.01%)<core::iter::adapters::enumerate::Enumerate<I> as core::iter::traits::iterator::Iterator>::fold (42,340,328 samples, 0.01%)<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::fold (42,340,328 samples, 0.01%)<core::iter::adapters::enumerate::Enumerate<I> as core::iter::traits::iterator::Iterator>::fold::enumerate::{{closure}} (42,340,328 samples, 0.01%)core::iter::adapters::map::map_fold::{{closure}} (42,340,328 samples, 0.01%)regex_syntax::ast::parse::ParserI<P>::pop_class_op (61,985,468 samples, 0.02%)core::slice::sort::stable::quicksort::quicksort (61,985,468 samples, 0.02%)core::ptr::drop_in_place<alloc::sync::Arc<alloc::vec::Vec<rsprocess::reaction::Reaction>>> (41,341,905 samples, 0.01%)<alloc::sync::Arc<T,A> as core::ops::drop::Drop>::drop (41,341,905 samples, 0.01%)all (323,415,197,143 samples, 100%)analysis (323,415,197,143 samples, 100.00%)analysisrsprocess::system::System::from (99,260,229 samples, 0.03%) \ No newline at end of file diff --git a/figures/flamegraph_mex5.pdf b/figures/flamegraph_mex5.pdf new file mode 100644 index 0000000..8dbbaa8 Binary files /dev/null and b/figures/flamegraph_mex5.pdf differ diff --git a/figures/flamegraph_mex5.svg b/figures/flamegraph_mex5.svg new file mode 100644 index 0000000..2114d70 --- /dev/null +++ b/figures/flamegraph_mex5.svg @@ -0,0 +1,491 @@ +Flame Graph Reset ZoomSearch <alloc::collections::btree::map::BTreeMap<K,V,A> as core::clone::Clone>::clone::clone_subtree (4,077,692 samples, 0.95%)alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Owned,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::new (4,077,692 samples, 0.95%)alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Owned,K,V,alloc::collections::btree::node::marker::Leaf>::new_leaf (4,077,692 samples, 0.95%)alloc::collections::btree::node::LeafNode<K,V>::new (4,077,692 samples, 0.95%)alloc::boxed::Box<T,A>::new_uninit_in (4,077,692 samples, 0.95%)alloc::boxed::Box<T,A>::try_new_uninit_in (4,077,692 samples, 0.95%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (4,077,692 samples, 0.95%)alloc::alloc::Global::alloc_impl (4,077,692 samples, 0.95%)alloc::alloc::alloc (4,077,692 samples, 0.95%)[libc.so.6] (4,077,692 samples, 0.95%)[libc.so.6] (4,077,692 samples, 0.95%)[unknown] (4,077,692 samples, 0.95%)[unknown] (4,077,692 samples, 0.95%)[unknown] (4,077,692 samples, 0.95%)[unknown] (4,077,692 samples, 0.95%)[unknown] (4,077,692 samples, 0.95%)<alloc::collections::btree::map::BTreeMap<K,V,A> as core::ops::drop::Drop>::drop (2,963,672 samples, 0.69%)core::mem::drop (2,963,672 samples, 0.69%)core::ptr::drop_in_place<alloc::collections::btree::map::IntoIter<u32,alloc::collections::btree::set_val::SetValZST>> (2,963,672 samples, 0.69%)<alloc::collections::btree::map::IntoIter<K,V,A> as core::ops::drop::Drop>::drop (2,963,672 samples, 0.69%)alloc::collections::btree::map::IntoIter<K,V,A>::dying_next (2,963,672 samples, 0.69%)alloc::collections::btree::navigate::LazyLeafRange<alloc::collections::btree::node::marker::Dying,K,V>::deallocating_next_unchecked (2,963,672 samples, 0.69%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Dying,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::deallocating_next_unchecked (2,963,672 samples, 0.69%)alloc::collections::btree::mem::replace (2,963,672 samples, 0.69%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Dying,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::deallocating_next_unchecked::{{closure}} (2,963,672 samples, 0.69%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Dying,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::deallocating_next (2,963,672 samples, 0.69%)alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,NodeType>,alloc::collections::btree::node::marker::Edge>::right_kv (2,963,672 samples, 0.69%)<alloc::collections::btree::map::Iter<K,V> as core::iter::traits::double_ended::DoubleEndedIterator>::next_back (4,099,899 samples, 0.96%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::next_kv (11,049,018 samples, 2.57%)al..alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,NodeType>,alloc::collections::btree::node::marker::Edge>::right_kv (11,049,018 samples, 2.57%)al..alloc::collections::btree::navigate::<impl alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::first_leaf_edge (4,106,992 samples, 0.96%)alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::Internal>,alloc::collections::btree::node::marker::Edge>::descend (4,106,992 samples, 0.96%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>,alloc::collections::btree::node::marker::KV>>::next_leaf_edge (7,022,906 samples, 1.64%)alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>,Type>::force (2,915,914 samples, 0.68%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::force (2,915,914 samples, 0.68%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Immut,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::next_unchecked::{{closure}} (22,160,214 samples, 5.16%)alloc:..alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Immut,K,V,NodeType>,alloc::collections::btree::node::marker::KV>::into_kv (4,088,290 samples, 0.95%)core::slice::<impl [T]>::get_unchecked (4,088,290 samples, 0.95%)<usize as core::slice::index::SliceIndex<[T]>>::get_unchecked (4,088,290 samples, 0.95%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Immut,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::next_unchecked (30,296,652 samples, 7.06%)alloc::co..alloc::collections::btree::mem::replace (30,296,652 samples, 7.06%)alloc::co..core::ptr::write (8,136,438 samples, 1.90%)c..<alloc::collections::btree::map::Iter<K,V> as core::iter::traits::iterator::Iterator>::next (62,552,545 samples, 14.57%)<alloc::collections::b..alloc::collections::btree::navigate::LazyLeafRange<alloc::collections::btree::node::marker::Immut,K,V>::next_unchecked (42,619,492 samples, 9.93%)alloc::collect..alloc::collections::btree::navigate::LazyLeafRange<BorrowType,K,V>::init_front (12,322,840 samples, 2.87%)al..core::ptr::read (8,225,529 samples, 1.92%)c..<alloc::collections::btree::set::BTreeSet<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (4,099,230 samples, 0.95%)alloc::slice::<impl [T]>::sort (4,099,230 samples, 0.95%)alloc::slice::stable_sort (4,099,230 samples, 0.95%)core::slice::sort::stable::sort (4,099,230 samples, 0.95%)core::slice::sort::shared::smallsort::insertion_sort_shift_left (4,099,230 samples, 0.95%)core::slice::sort::shared::smallsort::insert_tail (4,099,230 samples, 0.95%)<alloc::collections::btree::set::Intersection<T,A> as core::iter::traits::iterator::Iterator>::next (4,103,000 samples, 0.96%)core::cmp::impls::<impl core::cmp::Ord for u32>::cmp (4,103,000 samples, 0.96%)<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (8,202,816 samples, 1.91%)<..alloc::vec::Vec<T,A>::extend_desugared (8,202,816 samples, 1.91%)a..<core::iter::adapters::cloned::Cloned<I> as core::iter::traits::iterator::Iterator>::next (4,097,753 samples, 0.95%)<core::iter::adapters::chain::Chain<A,B> as core::iter::traits::iterator::Iterator>::next (4,097,753 samples, 0.95%)core::iter::adapters::chain::and_then_or_clear (4,097,753 samples, 0.95%)core::option::Option<T>::as_mut (4,097,753 samples, 0.95%)<core::iter::adapters::cloned::Cloned<I> as core::iter::traits::iterator::Iterator>::size_hint (4,055,517 samples, 0.94%)<core::iter::adapters::chain::Chain<A,B> as core::iter::traits::iterator::Iterator>::size_hint (4,055,517 samples, 0.94%)core::num::<impl usize>::saturating_add (4,055,517 samples, 0.94%)[libc.so.6] (15,691,971 samples, 3.66%)[lib..<alloc::alloc::Global as core::alloc::Allocator>::allocate (4,105,563 samples, 0.96%)alloc::alloc::Global::alloc_impl (4,105,563 samples, 0.96%)alloc::alloc::alloc (4,105,563 samples, 0.96%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (60,613,493 samples, 14.12%)<alloc::vec::Vec<T> a..<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (52,556,329 samples, 12.24%)<alloc::vec::Vec<T..alloc::vec::Vec<T>::with_capacity (12,302,150 samples, 2.87%)al..alloc::vec::Vec<T,A>::with_capacity_in (12,302,150 samples, 2.87%)al..alloc::raw_vec::RawVec<T,A>::with_capacity_in (12,302,150 samples, 2.87%)al..alloc::raw_vec::RawVecInner<A>::with_capacity_in (12,302,150 samples, 2.87%)al..alloc::raw_vec::RawVecInner<A>::try_allocate_in (12,302,150 samples, 2.87%)al..alloc::raw_vec::layout_array (8,196,587 samples, 1.91%)a..core::alloc::layout::Layout::repeat (8,196,587 samples, 1.91%)c..core::alloc::layout::Layout::repeat_packed (8,196,587 samples, 1.91%)c..core::num::<impl usize>::checked_mul (8,196,587 samples, 1.91%)c..core::intrinsics::unlikely (8,196,587 samples, 1.91%)c..<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,alloc::vec::into_iter::IntoIter<T>>>::from_iter (4,096,298 samples, 0.95%)<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (4,084,565 samples, 0.95%)core::hash::sip::u8to64_le (4,084,565 samples, 0.95%)core::ptr::copy_nonoverlapping (4,084,565 samples, 0.95%)<petgraph::graph_impl::Edge<E,Ix> as core::clone::Clone>::clone (3,454,204 samples, 0.80%)<rsprocess::label::Label as core::clone::Clone>::clone (3,454,204 samples, 0.80%)<rsprocess::set::Set as core::clone::Clone>::clone (3,454,204 samples, 0.80%)<alloc::collections::btree::set::BTreeSet<T,A> as core::clone::Clone>::clone (3,454,204 samples, 0.80%)<alloc::collections::btree::map::BTreeMap<K,V,A> as core::clone::Clone>::clone (3,454,204 samples, 0.80%)<alloc::collections::btree::map::BTreeMap<K,V,A> as core::clone::Clone>::clone::clone_subtree (3,454,204 samples, 0.80%)alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Owned,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::new (3,454,204 samples, 0.80%)alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Owned,K,V,alloc::collections::btree::node::marker::Leaf>::new_leaf (3,454,204 samples, 0.80%)alloc::collections::btree::node::LeafNode<K,V>::new (3,454,204 samples, 0.80%)alloc::boxed::Box<T,A>::new_uninit_in (3,454,204 samples, 0.80%)alloc::boxed::Box<T,A>::try_new_uninit_in (3,454,204 samples, 0.80%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (3,454,204 samples, 0.80%)alloc::alloc::Global::alloc_impl (3,454,204 samples, 0.80%)alloc::alloc::alloc (3,454,204 samples, 0.80%)[libc.so.6] (3,454,204 samples, 0.80%)[libc.so.6] (3,454,204 samples, 0.80%)<rsprocess::set::Set as rsprocess::set::BasicSet>::is_subset (12,345,398 samples, 2.88%)<r..alloc::collections::btree::set::BTreeSet<T,A>::is_subset (12,345,398 samples, 2.88%)al..core::option::Option<T>::map_or (4,115,091 samples, 0.96%)alloc::collections::btree::set::BTreeSet<T,A>::is_subset::{{closure}} (4,115,091 samples, 0.96%)core::cmp::impls::<impl core::cmp::Ord for u32>::cmp (4,115,091 samples, 0.96%)<rsprocess::set::Set as rsprocess::set::BasicSet>::subtraction (8,196,658 samples, 1.91%)<..alloc::collections::btree::set::BTreeSet<T,A>::difference (8,196,658 samples, 1.91%)a..<core::iter::adapters::peekable::Peekable<I> as core::iter::traits::iterator::Iterator>::next (4,101,263 samples, 0.96%)core::option::Option<T>::take (4,101,263 samples, 0.96%)core::mem::replace (4,101,263 samples, 0.96%)<alloc::collections::btree::set::Difference<T,A> as core::iter::traits::iterator::Iterator>::next (12,206,169 samples, 2.84%)<a..core::iter::adapters::peekable::Peekable<I>::peek (8,100,177 samples, 1.89%)c..core::option::Option<T>::get_or_insert_with (8,100,177 samples, 1.89%)c..<rsprocess::reaction::Reaction as rsprocess::reaction::BasicReaction>::enabled (4,099,660 samples, 0.96%)<rsprocess::set::Set as rsprocess::set::BasicSet>::union (4,052,882 samples, 0.94%)<T as core::convert::Into<U>>::into (4,052,882 samples, 0.94%)<rsprocess::set::Set as core::convert::From<alloc::vec::Vec<u32>>>::from (4,052,882 samples, 0.94%)<rsprocess::transitions::TransitionsIterator<rsprocess::set::Set,rsprocess::system::System,rsprocess::process::Process> as core::iter::traits::iterator::Iterator>::next (28,279,800 samples, 6.59%)<rsproces..<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::fold (28,279,800 samples, 6.59%)<core::sl..<rsprocess::transitions::TransitionsIterator<rsprocess::set::Set,rsprocess::system::System,rsprocess::process::Process> as core::iter::traits::iterator::Iterator>::next::{{closure}} (28,279,800 samples, 6.59%)<rsproces..core::ptr::drop_in_place<rsprocess::set::Set> (3,830,441 samples, 0.89%)core::ptr::drop_in_place<alloc::collections::btree::set::BTreeSet<u32>> (3,830,441 samples, 0.89%)core::ptr::drop_in_place<alloc::collections::btree::map::BTreeMap<u32,alloc::collections::btree::set_val::SetValZST>> (3,830,441 samples, 0.89%)<alloc::collections::btree::map::BTreeMap<K,V,A> as core::ops::drop::Drop>::drop (3,830,441 samples, 0.89%)<alloc::collections::btree::map::BTreeMap<K,V,A> as core::iter::traits::collect::IntoIterator>::into_iter (3,830,441 samples, 0.89%)[ld-linux-x86-64.so.2] (44,639 samples, 0.01%)[ld-linux-x86-64.so.2] (44,773 samples, 0.01%)[ld-linux-x86-64.so.2] (44,774 samples, 0.01%)[libc.so.6] (4,105,861 samples, 0.96%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (4,105,861 samples, 0.96%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (4,105,861 samples, 0.96%)<alloc::collections::btree::map::BTreeMap<K,V,A> as core::clone::Clone>::clone::clone_subtree (4,106,762 samples, 0.96%)alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Owned,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::new (4,106,762 samples, 0.96%)alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Owned,K,V,alloc::collections::btree::node::marker::Leaf>::new_leaf (4,106,762 samples, 0.96%)alloc::collections::btree::node::LeafNode<K,V>::new (4,106,762 samples, 0.96%)alloc::boxed::Box<T,A>::new_uninit_in (4,106,762 samples, 0.96%)alloc::boxed::Box<T,A>::try_new_uninit_in (4,106,762 samples, 0.96%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (4,106,762 samples, 0.96%)alloc::alloc::Global::alloc_impl (4,106,762 samples, 0.96%)alloc::alloc::alloc (4,106,762 samples, 0.96%)<alloc::collections::btree::map::Iter<K,V> as core::iter::traits::iterator::Iterator>::next (12,001,567 samples, 2.80%)<a..alloc::collections::btree::set::BTreeSet<T,A>::from_sorted_iter (4,105,106 samples, 0.96%)core::iter::traits::iterator::Iterator::map (4,105,106 samples, 0.96%)core::iter::adapters::map::Map<I,F>::new (4,105,106 samples, 0.96%)core::intrinsics::likely (3,541,581 samples, 0.83%)<alloc::collections::btree::set::BTreeSet<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (15,588,073 samples, 3.63%)<all..alloc::slice::<impl [T]>::sort (11,482,967 samples, 2.68%)al..alloc::slice::stable_sort (11,482,967 samples, 2.68%)al..core::slice::sort::stable::sort (11,482,967 samples, 2.68%)co..core::slice::sort::shared::smallsort::insertion_sort_shift_left (7,941,386 samples, 1.85%)c..core::slice::sort::shared::smallsort::insert_tail (7,941,386 samples, 1.85%)c..core::ptr::copy_nonoverlapping (3,896,255 samples, 0.91%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (4,098,680 samples, 0.95%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (4,098,680 samples, 0.95%)<core::iter::adapters::cloned::Cloned<I> as core::iter::traits::iterator::Iterator>::size_hint (4,098,680 samples, 0.95%)<core::iter::adapters::chain::Chain<A,B> as core::iter::traits::iterator::Iterator>::size_hint (4,098,680 samples, 0.95%)__rustc::__rust_alloc (4,107,009 samples, 0.96%)alloc::collections::btree::fix::<impl alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Owned,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::fix_right_border_of_plentiful (4,127,044 samples, 0.96%)alloc::collections::btree::dedup_sorted_iter::DedupSortedIter<K,V,I>::new (25,206,598 samples, 5.87%)alloc::..[libc.so.6] (4,110,167 samples, 0.96%)[libc.so.6] (11,866,927 samples, 2.76%)[l..[libc.so.6] (11,866,927 samples, 2.76%)[l..[unknown] (4,111,234 samples, 0.96%)[unknown] (4,111,234 samples, 0.96%)[unknown] (4,111,234 samples, 0.96%)[unknown] (4,111,234 samples, 0.96%)[unknown] (4,111,234 samples, 0.96%)[unknown] (4,111,234 samples, 0.96%)[unknown] (4,111,234 samples, 0.96%)alloc::collections::btree::map::BTreeMap<K,V,A>::bulk_build_from_sorted_iter (45,235,456 samples, 10.54%)alloc::collecti..alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Owned,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::new (15,976,877 samples, 3.72%)allo..alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Owned,K,V,alloc::collections::btree::node::marker::Leaf>::new_leaf (15,976,877 samples, 3.72%)allo..alloc::collections::btree::node::LeafNode<K,V>::new (15,976,877 samples, 3.72%)allo..alloc::boxed::Box<T,A>::new_uninit_in (15,976,877 samples, 3.72%)allo..alloc::boxed::Box<T,A>::try_new_uninit_in (15,976,877 samples, 3.72%)allo..<alloc::alloc::Global as core::alloc::Allocator>::allocate (15,976,877 samples, 3.72%)<all..alloc::alloc::Global::alloc_impl (15,976,877 samples, 3.72%)allo..alloc::alloc::alloc (15,976,877 samples, 3.72%)allo..__rustc::__rust_no_alloc_shim_is_unstable_v2 (4,109,950 samples, 0.96%)alloc::collections::btree::navigate::LazyLeafRange<alloc::collections::btree::node::marker::Dying,K,V>::deallocating_end (16,080,711 samples, 3.75%)allo..alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Dying,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::deallocating_end (16,080,711 samples, 3.75%)allo..alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Dying,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::deallocate_and_ascend (16,080,711 samples, 3.75%)allo..<alloc::alloc::Global as core::alloc::Allocator>::deallocate (16,080,711 samples, 3.75%)<all..alloc::alloc::dealloc (16,080,711 samples, 3.75%)allo..cfree (12,367,283 samples, 2.88%)cf..alloc::collections::btree::map::IntoIter<K,V,A>::dying_next (24,152,754 samples, 5.63%)alloc::..alloc::collections::btree::navigate::LazyLeafRange<alloc::collections::btree::node::marker::Dying,K,V>::deallocating_next_unchecked (8,072,043 samples, 1.88%)a..alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Dying,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::deallocating_next_unchecked (8,072,043 samples, 1.88%)a..alloc::collections::btree::mem::replace (8,072,043 samples, 1.88%)a..core::ptr::write (8,072,043 samples, 1.88%)c..alloc::collections::btree::set::BTreeSet<T,A>::intersection (8,194,687 samples, 1.91%)a..alloc::raw_vec::finish_grow (589,894 samples, 0.14%)<alloc::alloc::Global as core::alloc::Allocator>::grow (589,894 samples, 0.14%)alloc::alloc::Global::grow_impl (589,894 samples, 0.14%)alloc::alloc::realloc (589,894 samples, 0.14%)realloc (589,894 samples, 0.14%)[libc.so.6] (589,894 samples, 0.14%)[libc.so.6] (589,894 samples, 0.14%)core::ptr::drop_in_place<rsprocess::label::Label> (2,911,277 samples, 0.68%)core::ptr::drop_in_place<rsprocess::set::Set> (2,911,277 samples, 0.68%)core::ptr::drop_in_place<alloc::collections::btree::set::BTreeSet<u32>> (2,911,277 samples, 0.68%)core::ptr::drop_in_place<alloc::collections::btree::map::BTreeMap<u32,alloc::collections::btree::set_val::SetValZST>> (2,911,277 samples, 0.68%)[libc.so.6] (2,911,277 samples, 0.68%)[unknown] (128,348,543 samples, 29.90%)[unknown]execution::presets::dot (3,235,340 samples, 0.75%)alloc::fmt::format (3,235,340 samples, 0.75%)core::option::Option<T>::map_or_else (3,235,340 samples, 0.75%)alloc::fmt::format::{{closure}} (3,235,340 samples, 0.75%)alloc::fmt::format::format_inner (3,235,340 samples, 0.75%)core::fmt::Write::write_fmt (3,235,340 samples, 0.75%)<&mut W as core::fmt::Write::write_fmt::SpecWriteFmt>::spec_write_fmt (3,235,340 samples, 0.75%)core::fmt::write (3,235,340 samples, 0.75%)core::fmt::rt::Argument::fmt (3,235,340 samples, 0.75%)<rsprocess::dot::Dot<G> as core::fmt::Display>::fmt (3,235,340 samples, 0.75%)rsprocess::dot::Dot<G>::graph_fmt (3,235,340 samples, 0.75%)__rustc::__rdl_alloc (4,109,086 samples, 0.96%)__rustc::__rdl_dealloc (4,101,010 samples, 0.96%)std::sys::alloc::unix::<impl core::alloc::global::GlobalAlloc for std::alloc::System>::dealloc (4,101,010 samples, 0.96%)alloc::collections::btree::node::NodeRef<BorrowType,K,V,Type>::len (4,100,724 samples, 0.96%)alloc::collections::btree::append::<impl alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Owned,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::bulk_push (23,337,973 samples, 5.44%)alloc::..core::ptr::drop_in_place<alloc::collections::btree::dedup_sorted_iter::DedupSortedIter<u32,alloc::collections::btree::set_val::SetValZST,core::iter::adapters::map::Map<alloc::vec::into_iter::IntoIter<u32>,alloc::collections::btree::set::BTreeSet<u32>::from_sorted_iter<alloc::vec::into_iter::IntoIter<u32>>::{{closure}}>>> (8,120,843 samples, 1.89%)c..core::ptr::drop_in_place<core::iter::adapters::peekable::Peekable<core::iter::adapters::map::Map<alloc::vec::into_iter::IntoIter<u32>,alloc::collections::btree::set::BTreeSet<u32>::from_sorted_iter<alloc::vec::into_iter::IntoIter<u32>>::{{closure}}>>> (8,120,843 samples, 1.89%)c..core::ptr::drop_in_place<core::iter::adapters::map::Map<alloc::vec::into_iter::IntoIter<u32>,alloc::collections::btree::set::BTreeSet<u32>::from_sorted_iter<alloc::vec::into_iter::IntoIter<u32>>::{{closure}}>> (8,120,843 samples, 1.89%)c..core::ptr::drop_in_place<alloc::vec::into_iter::IntoIter<u32>> (8,120,843 samples, 1.89%)c..<alloc::vec::into_iter::IntoIter<T,A> as core::ops::drop::Drop>::drop (8,120,843 samples, 1.89%)<..core::ptr::drop_in_place<<alloc::vec::into_iter::IntoIter<T,A> as core::ops::drop::Drop>::drop::DropGuard<u32,alloc::alloc::Global>> (8,120,843 samples, 1.89%)c..<<alloc::vec::into_iter::IntoIter<T,A> as core::ops::drop::Drop>::drop::DropGuard<T,A> as core::ops::drop::Drop>::drop (8,120,843 samples, 1.89%)<..core::ptr::drop_in_place<alloc::raw_vec::RawVec<u32>> (8,120,843 samples, 1.89%)c..<alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop (8,120,843 samples, 1.89%)<..alloc::raw_vec::RawVecInner<A>::deallocate (8,120,843 samples, 1.89%)a..<alloc::alloc::Global as core::alloc::Allocator>::deallocate (8,120,843 samples, 1.89%)<..alloc::alloc::dealloc (8,120,843 samples, 1.89%)a..cfree (8,120,843 samples, 1.89%)c..alloc::collections::btree::fix::<impl alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Owned,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::fix_right_border_of_plentiful (84,915 samples, 0.02%)alloc::collections::btree::node::BalancingContext<K,V>::bulk_steal_left (84,915 samples, 0.02%)alloc::collections::btree::node::move_to_slice (84,915 samples, 0.02%)core::ptr::copy_nonoverlapping (84,915 samples, 0.02%)[libc.so.6] (84,915 samples, 0.02%)alloc::collections::btree::map::BTreeMap<K,V,A>::bulk_build_from_sorted_iter (12,238,986 samples, 2.85%)al..alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Owned,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::new (8,146,879 samples, 1.90%)a..alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Owned,K,V,alloc::collections::btree::node::marker::Leaf>::new_leaf (8,146,879 samples, 1.90%)a..alloc::collections::btree::node::LeafNode<K,V>::new (8,146,879 samples, 1.90%)a..alloc::boxed::Box<T,A>::new_uninit_in (8,146,879 samples, 1.90%)a..alloc::boxed::Box<T,A>::try_new_uninit_in (4,060,013 samples, 0.95%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (4,060,013 samples, 0.95%)alloc::alloc::Global::alloc_impl (4,060,013 samples, 0.95%)alloc::alloc::alloc (4,060,013 samples, 0.95%)alloc::collections::btree::navigate::LazyLeafRange<alloc::collections::btree::node::marker::Dying,K,V>::deallocating_end (8,135,282 samples, 1.90%)a..alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Dying,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::deallocating_end (8,135,282 samples, 1.90%)a..alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Dying,K,V,alloc::collections::btree::node::marker::LeafOrInternal>::deallocate_and_ascend (8,135,282 samples, 1.90%)a..<alloc::alloc::Global as core::alloc::Allocator>::deallocate (8,135,282 samples, 1.90%)<..alloc::alloc::dealloc (8,135,282 samples, 1.90%)a..cfree (8,135,282 samples, 1.90%)c..alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,alloc::collections::btree::node::marker::LeafOrInternal>,alloc::collections::btree::node::marker::KV>>::next_leaf_edge (3,684,443 samples, 0.86%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Dying,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::deallocating_next_unchecked (7,433,002 samples, 1.73%)alloc::collections::btree::mem::replace (7,433,002 samples, 1.73%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Dying,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::deallocating_next_unchecked::{{closure}} (7,433,002 samples, 1.73%)alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Dying,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::deallocating_next (7,433,002 samples, 1.73%)alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<BorrowType,K,V,NodeType>,alloc::collections::btree::node::marker::Edge>::right_kv (3,748,558 samples, 0.87%)alloc::collections::btree::map::IntoIter<K,V,A>::dying_next (35,761,292 samples, 8.33%)alloc::colle..alloc::collections::btree::navigate::LazyLeafRange<alloc::collections::btree::node::marker::Dying,K,V>::deallocating_next_unchecked (15,349,474 samples, 3.58%)allo..alloc::collections::btree::navigate::LazyLeafRange<BorrowType,K,V>::init_front (7,916,472 samples, 1.84%)a..<core::iter::adapters::copied::Copied<I> as core::iter::traits::iterator::Iterator>::size_hint (4,098,936 samples, 0.95%)<alloc::collections::btree::set::Difference<T,A> as core::iter::traits::iterator::Iterator>::size_hint (4,098,936 samples, 0.95%)core::num::<impl usize>::saturating_sub (4,098,936 samples, 0.95%)anon.a8034a099c7bdf771447e28c89ac7fdd.1.llvm.13230301628104807196 (11,257,540 samples, 2.62%)an..<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (11,257,540 samples, 2.62%)<a..<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (11,257,540 samples, 2.62%)<a..alloc::vec::Vec<T>::with_capacity (7,158,604 samples, 1.67%)alloc::vec::Vec<T,A>::with_capacity_in (7,158,604 samples, 1.67%)alloc::raw_vec::RawVec<T,A>::with_capacity_in (7,158,604 samples, 1.67%)alloc::raw_vec::RawVecInner<A>::with_capacity_in (7,158,604 samples, 1.67%)alloc::raw_vec::RawVecInner<A>::try_allocate_in (7,158,604 samples, 1.67%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (7,158,604 samples, 1.67%)alloc::alloc::Global::alloc_impl (7,158,604 samples, 1.67%)alloc::alloc::alloc (7,158,604 samples, 1.67%)malloc (7,158,604 samples, 1.67%)all (429,241,285 samples, 100%)analysis (429,241,285 samples, 100.00%)analysiscore::ptr::drop_in_place<petgraph::graph_impl::Edge<rsprocess::label::Label>> (2,884,851 samples, 0.67%)core::ptr::drop_in_place<rsprocess::label::Label> (2,884,851 samples, 0.67%)core::ptr::drop_in_place<rsprocess::set::Set> (2,884,851 samples, 0.67%)core::ptr::drop_in_place<alloc::collections::btree::set::BTreeSet<u32>> (2,884,851 samples, 0.67%)core::ptr::drop_in_place<alloc::collections::btree::map::BTreeMap<u32,alloc::collections::btree::set_val::SetValZST>> (2,884,851 samples, 0.67%)<alloc::collections::btree::map::BTreeMap<K,V,A> as core::ops::drop::Drop>::drop (2,884,851 samples, 0.67%)core::mem::drop (2,884,851 samples, 0.67%)core::ptr::drop_in_place<alloc::collections::btree::map::IntoIter<u32,alloc::collections::btree::set_val::SetValZST>> (2,884,851 samples, 0.67%)<alloc::collections::btree::map::IntoIter<K,V,A> as core::ops::drop::Drop>::drop (2,884,851 samples, 0.67%) \ No newline at end of file diff --git a/figures/reaction_system.pdf b/figures/reaction_system.pdf new file mode 100644 index 0000000..947ad25 Binary files /dev/null and b/figures/reaction_system.pdf differ diff --git a/figures/reaction_system.pdf_tex b/figures/reaction_system.pdf_tex new file mode 100644 index 0000000..2d55b87 --- /dev/null +++ b/figures/reaction_system.pdf_tex @@ -0,0 +1,97 @@ +%% Creator: Inkscape 1.4.2 (ebf0e940, 2025-05-08), www.inkscape.org +%% PDF/EPS/PS + LaTeX output extension by Johan Engelen, 2010 +%% Accompanies image file 'reaction_system.pdf' (pdf, eps, ps) +%% +%% To include the image in your LaTeX document, write +%% \input{.pdf_tex} +%% instead of +%% \includegraphics{.pdf} +%% To scale the image, write +%% \def\svgwidth{} +%% \input{.pdf_tex} +%% instead of +%% \includegraphics[width=]{.pdf} +%% +%% Images with a different path to the parent latex file can +%% be accessed with the `import' package (which may need to be +%% installed) using +%% \usepackage{import} +%% in the preamble, and then including the image with +%% \import{}{.pdf_tex} +%% Alternatively, one can specify +%% \graphicspath{{/}} +%% +%% For more information, please see info/svg-inkscape on CTAN: +%% http://tug.ctan.org/tex-archive/info/svg-inkscape +%% +\begingroup% + \makeatletter% + \providecommand\color[2][]{% + \errmessage{(Inkscape) Color is used for the text in Inkscape, but the package 'color.sty' is not loaded}% + \renewcommand\color[2][]{}% + }% + \providecommand\transparent[1]{% + \errmessage{(Inkscape) Transparency is used (non-zero) for the text in Inkscape, but the package 'transparent.sty' is not loaded}% + \renewcommand\transparent[1]{}% + }% + \providecommand\rotatebox[2]{#2}% + \newcommand*\fsize{\dimexpr\f@size pt\relax}% + \newcommand*\lineheight[1]{\fontsize{\fsize}{#1\fsize}\selectfont}% + \ifx\svgwidth\undefined% + \setlength{\unitlength}{2813.17492387bp}% + \ifx\svgscale\undefined% + \relax% + \else% + \setlength{\unitlength}{\unitlength * \real{\svgscale}}% + \fi% + \else% + \setlength{\unitlength}{\svgwidth}% + \fi% + \global\let\svgwidth\undefined% + \global\let\svgscale\undefined% + \makeatother% + \begin{picture}(1,0.42342253)% + \lineheight{1}% + \setlength\tabcolsep{0pt}% + \put(0,0){\includegraphics[width=\unitlength,page=1]{reaction_system.pdf}}% + \put(0.15467778,0.32842369){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}...\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=2]{reaction_system.pdf}}% + \put(0.28874122,0.32842369){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}...\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=3]{reaction_system.pdf}}% + \put(0.42280465,0.32842369){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}...\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=4]{reaction_system.pdf}}% + \put(0.55686808,0.32842369){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}...\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=5]{reaction_system.pdf}}% + \put(0.6909315,0.32842369){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}...\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=6]{reaction_system.pdf}}% + \put(0.82499493,0.32842369){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}...\end{tabular}}}}% + \put(0.95907919,0.1523901){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}...\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=7]{reaction_system.pdf}}% + \put(0.28876205,0.1523901){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}...\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=8]{reaction_system.pdf}}% + \put(0.42282548,0.1523901){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}...\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=9]{reaction_system.pdf}}% + \put(0.5568889,0.1523901){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}...\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=10]{reaction_system.pdf}}% + \put(0.69095233,0.1523901){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}...\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=11]{reaction_system.pdf}}% + \put(0.82501576,0.1523901){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}...\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=12]{reaction_system.pdf}}% + \put(0.15116558,0.14609298){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}$\emptyset$\end{tabular}}}}% + \put(0.08217495,0.14421148){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}$\delta :$\end{tabular}}}}% + \put(0.08217495,0.32887498){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}$\gamma :$\end{tabular}}}}% + \put(0.15477498,0.40209426){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}$C_0$\end{tabular}}}}% + \put(0.28887849,0.40209426){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}$C_1$\end{tabular}}}}% + \put(0.42356835,0.40209426){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}$C_2$\end{tabular}}}}% + \put(0.55761096,0.40209426){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}$C_3$\end{tabular}}}}% + \put(0.69105648,0.40209426){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}$C_4$\end{tabular}}}}% + \put(0.82563368,0.40209426){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}$C_5$\end{tabular}}}}% + \put(0.15477498,0.00725942){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}$D_0$\end{tabular}}}}% + \put(0.28887849,0.00725942){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}$D_1$\end{tabular}}}}% + \put(0.42356835,0.00725942){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}$D_2$\end{tabular}}}}% + \put(0.55761096,0.00725942){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}$D_3$\end{tabular}}}}% + \put(0.69105648,0.00725942){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}$D_4$\end{tabular}}}}% + \put(0.82563368,0.00619299){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}$D_5$\end{tabular}}}}% + \put(0.96021089,0.00619299){\color[rgb]{0,0,0}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}$D_6$\end{tabular}}}}% + \end{picture}% +\endgroup% diff --git a/figures/reaction_system.svg b/figures/reaction_system.svg new file mode 100644 index 0000000..e27dee8 --- /dev/null +++ b/figures/reaction_system.svg @@ -0,0 +1,620 @@ + + + + + + + + + + + ... + + + + ... + + + + ... + + + + ... + + + + ... + + + + ... + + + + + ... + + + + ... + + + + ... + + + + ... + + + + ... + + + + ... + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $\emptyset$ + $\delta :$ + $\gamma :$ + + + $C_0$ + $C_1$ + $C_2$ + $C_3$ + $C_4$ + $C_5$ + + + $D_0$ + $D_1$ + $D_2$ + $D_3$ + $D_4$ + $D_5$ + $D_6$ + + + diff --git a/figures/straight.pdf b/figures/straight.pdf new file mode 100644 index 0000000..ac9d32d Binary files /dev/null and b/figures/straight.pdf differ diff --git a/figures/straight.svg b/figures/straight.svg new file mode 100644 index 0000000..fb52dde --- /dev/null +++ b/figures/straight.svg @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/figures/straight_gui.png b/figures/straight_gui.png new file mode 100644 index 0000000..f5f186c Binary files /dev/null and b/figures/straight_gui.png differ diff --git a/figures/target_system.pdf b/figures/target_system.pdf new file mode 100644 index 0000000..8504045 Binary files /dev/null and b/figures/target_system.pdf differ diff --git a/figures/target_system.svg b/figures/target_system.svg new file mode 100644 index 0000000..201dd39 --- /dev/null +++ b/figures/target_system.svg @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/introduction.tex b/introduction.tex index 990b082..8050def 100644 --- a/introduction.tex +++ b/introduction.tex @@ -1,11 +1,13 @@ \begin{chapter}{Introduction} - % Reaction Systems (RSs) are a successful computational framework inspired by biological system. - % The underlying idea is that the interactions between biochemical reactions as well as the functioning of single reactions are based on the mechanisms of facilitation and inhibition. + Reaction Systems (RSs) are a successful computational framework inspired by biological system. + The interaction between biochemical reactions and the functioning of single reactions are based on the mechanisms of facilitation and inhibition, which can be modeled and analyzed using RS.\ - % A Reaction System consists of a set of entities and a set of reactions over them. Each reaction produces some set of entities P (called products) if enabled, meaning if a set R (called reactants) is wholly present and if a set I (called inhibitors) of entities is completely absent. - % The use of inhibitors induces non-monotonic behaviors that are difficult to analyze. - % This work aims to build software that aids in the study and analysis of certain classes of Reaction Systems. + In this work new software for modeling, analyzing and designing Reaction Systems is designed and developed, with focus on performance and user interface design. - % Entities can also be provided by an external context sequence to simulate \textit{in silico} biological experiment. + A Reaction System consists of a set of entities and a set of reactions over them. Each reaction produces some set of entities P (called products) if enabled, meaning if a set R (called reactants) is wholly present and if a set I (called inhibitors) of entities is completely absent. + The use of inhibitors induces non-monotonic behaviors that are difficult to analyze. + Entities can also be provided by an external context sequence to simulate \textit{in silico} biological experiment, expanded by structural operational semantics (SOS) rules to account for several biological experiments. In addition Positive RS, trace slicing, graph generation, bisimulation and more is available through an intuitive visual language with a graphical interface. + + \end{chapter} diff --git a/validation.tex b/validation.tex index 9fbc8f3..24db3de 100644 --- a/validation.tex +++ b/validation.tex @@ -1,3 +1,204 @@ -\begin{chapter}{Validation} +\begin{chapter}{Testing and Validation} + \begin{section}{Tests} + During the development of the library some tests were developed in order to test behavior in the changing code. They can be run with \(\texttt{cargo test}\). Tests don't cover all code branches, but have been written for pieces of code that might break more easily. Tests are usually present in a separate file as the structure declaration and have the suffix ``\_test.rs'' in their name, so that they might be easily recognized. + For example in the workspace \(\texttt{bisimilarity}\) tests have been written for the algorithms implemented. + +\begin{minted}{Rust} +#[test] +fn bisimilar_paige_tarjan_3() { + use petgraph::Graph; + let mut graph_b = Graph::new(); + + let node_b_1 = graph_b.add_node(1); + let node_b_2 = graph_b.add_node(2); + graph_b.add_edge(node_b_1, node_b_2, 1); + let node_b_3 = graph_b.add_node(3); + graph_b.add_edge(node_b_2, node_b_3, 2); + let node_b_4 = graph_b.add_node(4); + graph_b.add_edge(node_b_3, node_b_4, 2); + + let mut graph_c = Graph::new(); + + let node_c_1 = graph_c.add_node(1); + let node_c_2 = graph_c.add_node(2); + graph_c.add_edge(node_c_1, node_c_2, 1); + let node_c_3 = graph_c.add_node(3); + graph_c.add_edge(node_c_2, node_c_3, 2); + let node_c_4 = graph_c.add_node(4); + graph_c.add_edge(node_c_3, node_c_4, 2); + let node_c_5 = graph_c.add_node(5); + graph_c.add_edge(node_c_1, node_c_5, 1); + graph_c.add_edge(node_c_5, node_c_3, 2); + + assert!(bisimilarity(&&graph_b, &&graph_c)); + assert!(bisimilarity_ignore_labels(&&graph_b, &&graph_c)) +} +\end{minted} + + The macro call \(\texttt{\#[test]}\) instructs rust to treat the function as a test and thus generate the respective code only when building for the test suite. Then the two graphs are constructed; finally the results are tested with the \(\texttt{assert!}\) macro. + + The structure of the two graph can be seen in figure\ \ref{graph_paige_tarjan_3}. + + \begin{minipage}{\textwidth} + \centering + \begin{minipage}[b][][b]{0.25\textwidth} + \centering + \includegraphics[width=\textwidth, angle=0]{figures/straight.pdf} + \end{minipage}% + \begin{minipage}[b][][b]{0.49\textwidth} + \centering + \includegraphics[width=\textwidth, angle=0]{figures/bifurcated.pdf} + \end{minipage}% + \captionsetup{type=figure} + \caption{Graphs of tests}\label{graph_paige_tarjan_3} + \end{minipage}\vspace{1em} + + The behavior of the two systems is the same by ignoring the labels on the edges and by considering them, so they are always bisimilar, so the test should not panic. + + The graphs have been generated using ReactionSystemsGUI using the nodes displayed in figure\ \ref{generating_graphs}. Note that to differentiate the two edges exiting \(\texttt{node-1}\) additional entities \(\texttt{left}\) and \(\texttt{right}\) are used, but are not displayed because the function for displaying the edges masks only for \(\texttt{edge-1}\) and \(\texttt{edge-2}\). + + \begin{minipage}{\textwidth} + \centering + \begin{minipage}{0.8\textwidth} + \centering + \includegraphics[width=\textwidth]{figures/straight_gui.png} + \end{minipage}% + + \begin{minipage}{0.8\textwidth} + \centering + \includegraphics[width=\textwidth]{figures/bifurcated_gui.png} + \end{minipage}% + \captionsetup{type=figure} + \caption{Generating graphs using ReactionSystemsGUI}\label{generating_graphs} + \end{minipage}\vspace{1em} + + In addition to automated tests, some example inputs are provided in the folder \href{https://github.com/elvisrossi/ReactionSystems/tree/master/testing}{{\tt testing}}. The extension \(\texttt{.system}\) symbolizes system and associated instructions; the extension \(\texttt{.experiment}\) symbolizes an experiment, see\ \ref{experiment}. + + These examples were also used to do manual integration testing. + + The example \(\texttt{target.system}\) + \begin{figure}[!ht] + \centering +\begin{minted}{Text} +Environment: [x = {a}.y, y =({a}.{a, b}.nill + {b}.nill) ] +Initial Entities: {a, b} +Context: [({a,b}.{a}.{a,c}.x + {a,b}.{a}.{a}.nill)] +Reactions: ([{a,b}, {c}, {b}]) + +Target > Print, +Target (Limit: 7) > Print, +Target (Limit: 6) > Print, +Target (Limit: 5) > Print +\end{minted} + \phantomsubcaption\label{example_target_system_instructions} + \end{figure} + generates as output: + +\begin{minted}{Text} +After 6 steps we arrive at state: +{b} +After 6 steps we arrive at state: +{b} +After 6 steps we arrive at state: +{b} +After 5 steps we arrive at state: +{} +\end{minted} + + The output is correct since, as we can see from the graph of the system in figure\ \ref{graph_target_system} that the system has as leftmost production six states and the end state has entities set \(\texttt{\{b\}}\). + + \begin{figure}[h] + \centering + \includegraphics[width=0.5\textwidth, height=0.46\textheight, keepaspectratio]{figures/target_system.pdf} + \caption{Graph of example\ \ref{example_target_system_instructions}, nodes have available entities as label, edges have the entities provided by the context as labels.}\label{graph_target_system} + \end{figure} + + A small Perl script is provided that can convert systems created for the Prolog version of the program into the syntax described in\ \ref{design_system}. The script was used to convert systems that model mutual exclusion (MEX) available in the folder \href{https://github.com/elvisrossi/ReactionSystems/tree/master/testing/mex}{\(\texttt{testing/mex}\)}. + + A MEX system is composed of \(n\) looping processes, which only one can be in the critical section. Each process is identified by \(\texttt{out\_i}\) if is out of the critical section, \(\texttt{req\_i}\) if has requested to enter the critical section and \(\texttt{in\_i}\) if is in the critical section. Without the token \(\texttt{act\_i}\) no process can change state: + +\begin{minted}{Text} +[{out_1}, {act_1}, {out_1}]; +[{req_1}, {act_1}, {req_1}]; +[{in_1}, {act_1}, {in_1}]; +\end{minted} + + And \(\texttt{act\_i}\) is required to change state: + +\begin{minted}{Text} +[{out_1, act_1}, {}, {req_1}]; +\end{minted} + + Any subset of processes can be activated, the requests are preserved: + +\begin{minted}{Text} +[{req_1, act_1, act_2}, {}, {req_1}]; +[{req_1, act_1, act_3}, {}, {req_1}]; +... +[{req_1, act_1, act_n}, {}, {req_1}]; +\end{minted} + + Entering the critical section is handled by two other entities: \(\texttt{lock}\), which symbolizes that a process is in the critical section, and \(\texttt{done}\), which symbolizes that the critical section has been exited. \(\texttt{lock}\) remains until done: + +\begin{minted}{Text} +[{lock}, {done}, {lock}]; +\end{minted} + + No other processes have to have the lock for a process to enter the critical section: + +\begin{minted}{Text} +[{req_1,act_1},{lock,act_2,...,act_n},{in_1,lock}]; +\end{minted} + + The execution of these examples is more computationally expensive with increasing \(n\). The execution of \(\texttt{mex10.system}\) took 78791.202 milliseconds to run the instruction\ \ref{instruction_mex} which generate the graph of the system, converts it to dot format and saves it.\vspace{1em} + + \begin{minipage}{\textwidth} +\begin{minted}{Text} +Digraph > Dot + | Entities + | Context + | ! "white" + | ! "black" + > Save("out.dot") +\end{minted} + \captionsetup{type=table, name=\textbf{Instruction}} + \caption{Instruction for MEX systems.}\label{instruction_mex} + \end{minipage}\vspace{1em} + + \(\texttt{mex5.system}\) takes instead 109.148 milliseconds to run. + + Performance has been analyzed using perf\cite{manualperf_2025} and flamegraph\cite{Ochtman2025}. + + \begin{figure} + \centering + \includegraphics[width=\textwidth, height=0.5\textheight, keepaspectratio]{figures/flamegraph_mex5.pdf} + \caption{Flamegraph of MEX RS with 5 processes.} + \end{figure} + + \begin{figure} + \centering + \includegraphics[width=\textwidth, height=0.5\textheight, keepaspectratio]{figures/flamegraph_mex10.pdf} + \caption{Flamegraph of MEX RS with 10 processes.} + \end{figure} + + Both of the flamegraphs share distinct features, but the one regarding MEX RS with 10 processes has finer resolution since the execution time is much longer. In decreasing order, some of the that took most samples are: + + \begin{itemize} + \item \(\texttt{unknown}\) that took 29\% of samples, + \item \(\texttt{alloc::collections::btree::map::IntoIter::dying\_next}\) that took 14\% of samples, + \item \(\texttt{::next}\) that took 11\% of samples, + \item \(\texttt{alloc::collections::btree::append::::bulk\_push}\) that took 11\% of samples, + \item \(\texttt{alloc::collections::btree::map::BTreeMap::bulk\_build\_from\_sorted\_iter}\) that took 5,1\% of samples, + \item \(\ldots\) + \end{itemize} + + From the perf data we can gather that parsing took less than 3\% of total time, and that \(\texttt{unknown}\) refers to the methods belonging to System (section\ \ref{development_system}). This behavior is expected since most of the computation is carried by the structure that generates the graph. + \end{section} + + \begin{section}{Validation} + During development key issues identified from previous projects where performance and usability. The biggest problem with prolog software is exceeding the stack limit and thus running out of memory. This problem is completely solved by using Rust. Another problem was that of performance. On dot file generation a 2 to 7 times performance improvement is seen, depending on the model simulated. + + Usability has been taken into account both for an end user and for a programmer that intend to expand the system: grammar follows general rules largely compatible with previous projects; the grammar is decoupled from the internal representation and thus permits greater maintainability and expandability; the use of traits permits more modularity and the coexistence of multiple types of RS in the same project; domain specific languages allow more efficient and intuitive instruction specification; the graphical user interface presents instructions and methods over reaction systems in a more intuitive way that with just a command line interface; the node system allows greater modularity and for easy additions of new instructions; easy SVG generation reduce the time spent between different software and speeds up the end user's tasks; saving the state of the application allows for lower friction when switching between projects; the web GUI provides a platform agnostic interface for quick development. + \end{section} \end{chapter}