From 294629bdb85219ed20455f4da2845fa442310c1d Mon Sep 17 00:00:00 2001 From: Antongiacomo Polimeno Date: Mon, 6 May 2024 15:22:38 +0200 Subject: [PATCH] Updated tables --- experiment.tex | 101 +++++++++++++++++++++------------- main.tex | 2 +- metrics.tex | 32 +++++------ pipeline_instance_example.tex | 40 +++++++------- test.tikz | 6 -- text.pdf | Bin 25325 -> 0 bytes 6 files changed, 101 insertions(+), 80 deletions(-) delete mode 100644 test.tikz delete mode 100644 text.pdf diff --git a/experiment.tex b/experiment.tex index c964cfd..6cd09ca 100644 --- a/experiment.tex +++ b/experiment.tex @@ -1,7 +1,7 @@ \section{Experiments}\label{sec:experiment} We experimentally evaluated the performance and quality of our methodology (heuristic algorithm in \cref{subsec:heuristics}), and compared it against the exhaustive approach in~\cref{sec:nphard}. In the following, \cref{subsec:experiments_infrastructure} presents the simulator and testing infrastructure adopted in our experiments; -%, as well as the complete experimental settings; +%, as well as the complete experimental settings; \cref{subsec:experiments_performance} analyses the performance of our solution in terms of execution time; \cref{subsec:experiments_quality} presents the quality of our heuristic algorithm in generating of the best pipeline instance according to the metrics $M_J$ and $M_{JSD}$ in \cref{subsec:metrics}. \subsection{Testing Infrastructure and Experimental Settings}\label{subsec:experiments_infrastructure} @@ -9,10 +9,10 @@ \subsection{Testing Infrastructure and Experimental Settings}\label{subsec:exper % Our testing infrastructure is a Swift-based simulator of a service-based ecosystem, including service execution, comparison, and composition. The simulator first defines the pipeline template as a sequence of vertices in the range 3$-$7 (the length $l$ of the pipeline template) and defines the size \windowsize\ of the sliding window, such that \windowsize$<$$l$. We recall that alternative vertices are modeled in different pipeline templates, while parallel vertices are not considered since they only add a fixed execution time that is negligible and do not affect the performance and quality of our approach. Each vertex is associated with a (set of) policy that applies a filtering transformation that either remove a percentage of data in $[0.5,0.8]$ (\average) or in $[0.20,1]$ (\wide). % % \begin{enumerate*}[label=\textit{\roman*})] % % \item \average: data removal percentage within $[0.5,0.8]$. -% % \item \wide: data removal percentage within +% % \item \wide: data removal percentage within % % \end{enumerate*} -The simulator then starts the instantiation process as shown in Figure~\ref{fig:execution_example}\hl{DA MODIFICARE COME SEQUENZA E NON ALTERNATIVA/PARALLELO}. At each step $i$, it selects the subset \{\vi{i},$\ldots$,$v_{\windowsize+i-1}$\} of vertices with their corresponding candidate services, and generates all possible service combinations. For each combination, the simulator calculates a given metric $M$ and selects the service that instantiates \vi{i} from the optimal combination according to $M$. The window is shifted step 1 (i.e., $i$=$i$+1) and the instantiation process restart. When the sliding window reach the end of the pipeline template, that is, $v_{\windowsize+i-1}$$=$$\vi{l}$, the simulator computes the optimal service combination and instantiates the remaining vertices with the corresponding services. +The simulator then starts the instantiation process as shown in Figure~\ref{fig:execution_example}. At each step $i$, it selects the subset \{\vi{i},$\ldots$,$v_{\windowsize+i-1}$\} of vertices with their corresponding candidate services, and generates all possible service combinations. For each combination, the simulator calculates a given metric $M$ and selects the service that instantiates \vi{i} from the optimal combination according to $M$. The window is shifted step 1 (i.e., $i$=$i$+1) and the instantiation process restart. When the sliding window reach the end of the pipeline template, that is, $v_{\windowsize+i-1}$$=$$\vi{l}$, the simulator computes the optimal service combination and instantiates the remaining vertices with the corresponding services. We note that a hash function randomly simulates the natural interdependence between services, modeling a data removal on one service that might impact another one. \hl{LA SPECIFICHIAMO UN PO' MEGLIO?} %By assigning weights to the services using this function, the system aims to reflect the interconnected dynamics among the services. @@ -27,25 +27,33 @@ \subsection{Testing Infrastructure and Experimental Settings}\label{subsec:exper \centering \resizebox{\columnwidth}{!}{% \begin{tikzpicture}[framed] - \node[draw, circle,fill=red!20] (s41) at (1,1.7) {$\sii{1}$}; - \node[draw, circle, fill=green!20] (s42) at (1,0) {$\sii{2}$}; - \node[draw, circle, fill=red!20] (s43) at (1,-1.7) {$\sii{3}$}; - \node[draw, circle] (s1) at (3,1.7) {$\sii{11}$}; - \node[draw, circle] (s2) at (3,0) {$\sii{12}$}; - \node[draw, circle] (s3) at (3,-1.7) {$\sii{13}$}; + \node[draw, circle, fill=gray!20,minimum width=1.2cm] (v1) at (1,5.2) {$\vi{1}$}; + \node[draw, circle, fill=gray!20,minimum width=1.2cm] (v2) at (3,5.2) {$\vi{2}$}; + \node[draw, circle, fill=gray!20,minimum width=1.2cm] (v3) at (5,5.2) {$\vi{3}$}; + \node[draw, circle, fill=gray!20,minimum width=1.2cm] (v4) at (7,5.2) {$\vi{4}$}; + \node[draw, circle, fill=gray!20,minimum width=1.2cm] (v5) at (9,5.2) {$\vi{5}$}; + \node[above, shift=({0,0.5}) ] at (v3.north) {Sliding Window}; - \node[draw, circle] (s11) at (5,1.7) {$\sii{21}$}; - \node[draw, circle] (s12) at (5,0) {$\sii{22}$}; - \node[draw, circle] (s13) at (5,-1.7) {$\sii{23}$}; + \node[draw, rectangle,fill=red!20] (s41) at (1,3.4) {$\sii{1}$}; + \node[draw, rectangle, fill=green!20] (s42) at (1,1.7) {$\sii{2}$}; + \node[draw, rectangle, fill=red!20] (s43) at (1,0) {$\sii{3}$}; - \node[draw, circle] (s21) at (7,1.7) {$\sii{31}$}; - \node[draw, circle] (s22) at (7,0) {$\sii{32}$}; - \node[draw, circle] (s23) at (7,-1.7) {$\sii{33}$}; + \node[draw, rectangle] (s1) at (3,3.4) {$\sii{11}$}; + \node[draw, rectangle] (s2) at (3,1.7) {$\sii{12}$}; + \node[draw, rectangle] (s3) at (3,0) {$\sii{13}$}; - \node[draw, circle] (s31) at (9,1.7) {$\sii{41}$}; - \node[draw, circle] (s32) at (9,0) {$\sii{42}$}; - \node[draw, circle] (s33) at (9,-1.7) {$\sii{43}$}; + \node[draw, rectangle] (s11) at (5,3.4) {$\sii{21}$}; + \node[draw, rectangle] (s12) at (5,1.7) {$\sii{22}$}; + \node[draw, rectangle] (s13) at (5,0) {$\sii{23}$}; + + \node[draw, rectangle] (s21) at (7,3.4) {$\sii{31}$}; + \node[draw, rectangle] (s22) at (7,1.7) {$\sii{32}$}; + \node[draw, rectangle] (s23) at (7,0) {$\sii{33}$}; + + \node[draw, rectangle] (s31) at (9,3.4) {$\sii{41}$}; + \node[draw, rectangle] (s32) at (9,1.7) {$\sii{42}$}; + \node[draw, rectangle] (s33) at (9,0) {$\sii{43}$}; % \draw[->] (node2) -- (node3); @@ -78,12 +86,26 @@ \subsection{Testing Infrastructure and Experimental Settings}\label{subsec:exper \draw[->,dashed] (s13) -- (s22); \draw[->,dashed] (s13) -- (s23); + \draw[->] (v1) -- (v2); + \draw[->] (v2) -- (v3); + \draw[->] (v3) -- (v4); + \draw[->] (v4) -- (v5); + \begin{scope}[on background layer] \draw[thick, dashed, fill=red!10, opacity=0.5] ([shift={(-0.5,0.5)}]s1.north west) rectangle ([shift={(0.5,-0.5)}]s23.south east); + + + \end{scope} + \begin{scope}[on background layer] + \draw[thick, dashed, fill=red!10, opacity=0.5] + ([shift={(-0.5,0.5)}]v2.north west) rectangle ([shift={(0.5,-0.5)}]v4.south east); + \end{scope} + + \end{tikzpicture} } \caption{Execution example} @@ -98,7 +120,7 @@ \subsection{Perfomance}\label{subsec:experiments_performance} % \item % \end{itemize} % \subsection{Metriche/Euristiche} -We first measured the performance (execution time) of our exhaustive and heuristic solutions. To this aim, we varied the number of vertices from 2 to 5 (step 1) and the number of services per vertex from 2 to 6 (step 1). \cref{fig:perf_exhaustive} presents our results for the exhaustive solution, showing an exponential trend in the execution time. We can observe that, as the number of vertices increases, the execution time grows exponentially. Execution times for up to 5 vertices and 6 services were computed, while the remaining data points were obtained through interpolation.\hl{QUALI SONO INTERPOLATI? 5 E 6 SONO TUTTI I CASI.} +We first measured the performance (execution time) of our exhaustive and heuristic solutions. To this aim, we varied the number of vertices from 2 to 5 (step 1) and the number of services per vertex from 2 to 6 (step 1). \cref{fig:perf_exhaustive} presents our results for the exhaustive solution, showing an exponential trend in the execution time. We can observe that, as the number of vertices increases, the execution time grows exponentially. Execution times for up to 5 vertices and 6 services were computed, while the remaining data points were obtained through interpolation.\hl{QUALI SONO INTERPOLATI? 5 E 6 SONO TUTTI I CASI.} %Subsequently, the logical extension of this empirical inquiry involves evaluating the execution time efficiency attributable to the implementation of the sliding window heuristic. We then evaluated our heuristic and measured its performance (execution time) varying the window size \windowsize\ from X to Y (step 1). \cref{fig:perf_window} (log scale) presents our results for the heuristic solution. We can observe a substantial reduction in execution time, with the heuristic always able to produce an instance in less than \hl{TO ADD}.\hl{NON VEDO LA FIGURA.} @@ -111,7 +133,7 @@ \subsection{Perfomance}\label{subsec:experiments_performance} \subsection{Quality}\label{subsec:experiments_quality} We finally evaluated the quality of our heuristic with different \windowsize\ comparing, where possible, its results with the optimal solution retrieved by executing the exhaustive approach. %The latter is executed with window size equals to the number of vertices in the pipeline template, and provides the best, among all possible, solutions. -The quality of the heuristic was then calculated as the ratio between the value of metric $M$ retrieved by the heuristic and the one obtained by the exhaustive approach. +The quality of the heuristic was then calculated as the ratio between the value of metric $M$ retrieved by the heuristic and the one obtained by the exhaustive approach. We run our experiments varying: \emph{i)} the length $l$ of the pipeline template in [3,7], that is, the number of vertices composed in a sequence, \emph{ii)} the window size \windowsize\ in [1,$l$], and \emph{iii)} the number of candidate services for each vertex in the pipeline template in [2, 7]. Each vertex is associated with a (set of) policy that applies a filtering transformation that either remove a percentage of data in $[0.5,0.8]$ (\average) or in $[0.20,1]$ (\wide). @@ -119,34 +141,39 @@ \subsection{Quality}\label{subsec:experiments_quality} \cref{fig:quality_window_average_perce,fig:quality_window_perce_wide} present our results with metric $M_J$ in \cref{subsec:metrics} for settings \wide and \average, respectively. -In general, we observe that the quality of our heuristic approach increases as the window size increases, providing a quality comparable to the exhaustive approach when the window size \windowsize\ approaches the length $l$ of the pipeline template. -When considering setting \wide, the greedy approach (\windowsize=1) provides good results on average (from X to Y), it shows substantial oscillations, for instance, varying the quality between X and Y for 3 vertices, X and Y for 4 vertices, X and Y for 5 vertices, X and Y for 6 vertices, X and Y for 7 vertices. This same trends emerge when the window size is less than $l$/2, while it starts approaching the optimum when the window size is higher than $l$/2. For instance, when \windowsize=$l$-1, the quality varis between X and Y for 3 vertices, X and Y for 4 vertices, X and Y for 5 vertices, X and Y for 6 vertices, X and Y for 7 vertices. -When considering setting \average, ... +In general, we observe that the quality of our heuristic approach increases as the window size increases, providing a quality comparable to the exhaustive approach when the window size \windowsize\ approaches the length $l$ of the pipeline template. + +When considering setting \wide, the greedy approach (\windowsize=1) provides good results on average (from X to Y), it shows substantial oscillations, for instance, varying the quality between 0.882 and 0.970 for 3 vertices, 0.810 and 0.942 for 4 vertices, 0.580 and 0.853 for 5 vertices, 0.682 and 0.943 for 6 vertices, 0.596 and 0.821 for 7 vertices. This same trends emerge when the window size is less than $l$/2, while it starts approaching the optimum when the window size is higher than $l$/2. For instance, when \windowsize=$l$-1, the quality varis between 0.957 and 1.0 for 3 vertices, 0.982 and 1.0 for 4 vertices, 0.986 and 0.998 for 5 vertices, 0.977 and 1.0 for 6 vertices, 0.996 and 1.0 for 7 vertices. + +When considering setting \average, the greedy approach (\windowsize=1) provides good results on average (from X to Y), it shows substantial oscillations, for instance, varying the quality between 0.927 and 0.978 for 3 vertices, 0.903 and 0.962 for 4 vertices, 0.840 and 0.915 for 5 vertices, 0.815 and 0.934 for 6 vertices, 0.721 and 0.935 for 7 vertices. This same trends emerge when the window size is less than $l$/2, while it starts approaching the optimum when the window size is higher than $l$/2. For instance, when \windowsize=$l$-1, the quality varis between 0.980 and 1.0 for 3 vertices, 0.978 and 1.0 for 4 vertices, 0.954 and 1 for 5 vertices, 0.987 and 1.0 for 6 vertices, 0.990 and 1.0 for 7 vertices. +% \hl{RIVEDI DA QUA COME SOPRA FINO A...} + +% In a configuration employing a \wide setting with three nodes, the average quality ratio for a window size of one is 0.93, with a standard deviation of 0.02; for a window size of two, it is 0.98 with a standard deviation of 0.01. When the number of nodes is increased to four, the average quality ratios observed are 0.88 for a window size of one (standard deviation = 0.04), 0.96 for a window size of two (standard deviation = 0.02), and 0.99 for a window size of three. Further increasing the node count to five yields average quality ratios of 0.76 for a window size of one (standard deviation = 0.09), 0.90 for a window size of two (standard deviation = 0.04), with further increments in window sizes of three and four maintaining standard deviations of 0.01. +% For six nodes, the average quality ratios are as follows: 0.78 for a window size of one (standard deviation = 0.09); 0.87 for a window size of two (standard deviation = 0.04); 0.95 for a window size of three (standard deviation = 0.02); 0.97 for a window size of four (standard deviation = 0.02); and 0.99 for a window size of five. Notably, the range of quality ratios (maximum-minimum) narrows as the window size increases, from 0.261 for a window size of one to 0.14 for a window size of two, and further to 0.02 for a window size of five. +% In a seven-node configuration, the average quality ratios are as follows: 0.73 for a window size of one (standard deviation = 0.08); 0.87 for a window size of two (standard deviation = 0.08); 0.95 for a window size of three (standard deviation = 0.02); 0.96 for a window size of four (standard deviation = 0.02); and 0.99 for both window sizes of five and six (standard deviation = 0.02 each). -\hl{RIVEDI DA QUA COME SOPRA FINO A...} +% In an \average setting with three nodes, the average quality ratios are 0.95 for a window size of one, with a standard deviation of 0.017, and 0.99 for a window size of two, with a standard deviation of 0.006. Expanding to four nodes, the quality ratios observed are 0.93 for a window size of one (standard deviation = 0.019), 0.97 for a window size of two (standard deviation = 0.006), and 0.99 for a window size of three (standard deviation = 0.007). Increasing the node count to five yields average quality ratios of 0.88 for a window size of one (standard deviation = 0.02), 0.93 for a window size of two (standard deviation = 0.03), 0.97 for a window size of three (standard deviation = 0.015), and 0.98 for a window size of four (standard deviation = 0.016). +% For six nodes, the quality ratios are as follows: 0.87 for a window size of one (standard deviation = 0.047), 0.92 for a window size of two (standard deviation = 0.058), 0.96 for a window size of three (standard deviation = 0.021), 0.97 for a window size of four (standard deviation = 0.014), and 0.99 for a window size of five (standard deviation = 0.004). For seven nodes, the respective quality ratios are 0.83 for a window size of one (standard deviation = 0.068), 0.92 for a window size of two (standard deviation = 0.030), 0.98 for both window sizes of three and four (standard deviation = 0.007 and 0.017), and 0.99 for window sizes of five and six (standard deviation = 0.006 and 0.004). -In a configuration employing a \wide setting with three nodes, the average quality ratio for a window size of one is 0.93, with a standard deviation of 0.02; for a window size of two, it is 0.98 with a standard deviation of 0.01. When the number of nodes is increased to four, the average quality ratios observed are 0.88 for a window size of one (standard deviation = 0.04), 0.96 for a window size of two (standard deviation = 0.02), and 0.99 for a window size of three. Further increasing the node count to five yields average quality ratios of 0.76 for a window size of one (standard deviation = 0.09), 0.90 for a window size of two (standard deviation = 0.04), with further increments in window sizes of three and four maintaining standard deviations of 0.01. -For six nodes, the average quality ratios are as follows: 0.78 for a window size of one (standard deviation = 0.09); 0.87 for a window size of two (standard deviation = 0.04); 0.95 for a window size of three (standard deviation = 0.02); 0.97 for a window size of four (standard deviation = 0.02); and 0.99 for a window size of five. Notably, the range of quality ratios (maximum-minimum) narrows as the window size increases, from 0.261 for a window size of one to 0.14 for a window size of two, and further to 0.02 for a window size of five. -In a seven-node configuration, the average quality ratios are as follows: 0.73 for a window size of one (standard deviation = 0.08); 0.87 for a window size of two (standard deviation = 0.08); 0.95 for a window size of three (standard deviation = 0.02); 0.96 for a window size of four (standard deviation = 0.02); and 0.99 for both window sizes of five and six (standard deviation = 0.02 each). +\cref{fig:quality_window_wide_qualitative,fig:quality_window_average_qualitative} display the outcomes assessed metric $M_{JSD}$ in \cref{subsec:metrics} for settings \wide and \average, respectively. -In an \average setting with three nodes, the average quality ratios are 0.95 for a window size of one, with a standard deviation of 0.017, and 0.99 for a window size of two, with a standard deviation of 0.006. Expanding to four nodes, the quality ratios observed are 0.93 for a window size of one (standard deviation = 0.019), 0.97 for a window size of two (standard deviation = 0.006), and 0.99 for a window size of three (standard deviation = 0.007). Increasing the node count to five yields average quality ratios of 0.88 for a window size of one (standard deviation = 0.02), 0.93 for a window size of two (standard deviation = 0.03), 0.97 for a window size of three (standard deviation = 0.015), and 0.98 for a window size of four (standard deviation = 0.016). -For six nodes, the quality ratios are as follows: 0.87 for a window size of one (standard deviation = 0.047), 0.92 for a window size of two (standard deviation = 0.058), 0.96 for a window size of three (standard deviation = 0.021), 0.97 for a window size of four (standard deviation = 0.014), and 0.99 for a window size of five (standard deviation = 0.004). For seven nodes, the respective quality ratios are 0.83 for a window size of one (standard deviation = 0.068), 0.92 for a window size of two (standard deviation = 0.030), 0.98 for both window sizes of three and four (standard deviation = 0.007 and 0.017), and 0.99 for window sizes of five and six (standard deviation = 0.006 and 0.004). +When considering setting \wide, the greedy approach (\windowsize=1) provides good results on average (from X to Y), it shows substantial oscillations, for instance, varying the quality between 0.954 and 0.993 for 3 vertices, 0.939 and 0.993 for 4 vertices, 0.899 and 0.960 for 5 vertices, 0.878 and 0.949 for 6 vertices, 0.870 and 0.914 for 7 vertices. This same trends emerge when the window size is less than $l$/2, while it starts approaching the optimum when the window size is higher than $l$/2. For instance, when \windowsize=$l$-1, the quality varis between 0.991 and 1,0 for 3 vertices, 0.989 and 1.0 for 4 vertices, 0.994 and 1.0 for 5 vertices, 0.993 and 1.0 for 6 vertices, 0.997 and 1.0 for 7 vertices. -\cref{fig:quality_window_wide_qualitative,fig:quality_window_average_qualitative} display the outcomes assessed by the \emph{qualitative} metric described in \cref{subsec:metrics}, corresponding to the \wide and \average settings, respectively. -In a \wide setting with three nodes, average quality ratios were observed as 0.98 for a window size of one, with a standard deviation of 0.014, and 0.998 for a window size of two, with a standard deviation of 0.005. Increasing the node count to four, the quality ratios are 0.97 for a window size of one (standard deviation = 0.019), 0.99 for a window size of two (standard deviation = 0.004), and 0.996 for a window size of three (standard deviation = 0.004). +When considering setting \average, the greedy approach (\windowsize=1) provides good results on average (from X to Y), it shows substantial oscillations, for instance, varying the quality between 0.981 and 0.994 for 3 vertices, 0.957 and 0.991 for 4 vertices, 0.973 and 0.984 for 5 vertices, 0.947 and 0.974 for 6 vertices, 0.925 and 0.981 for 7 vertices. This same trends emerge when the window size is less than $l$/2, while it starts approaching the optimum when the window size is higher than $l$/2. For instance, when \windowsize=$l$-1, the quality varis between 0.993 and 0.999 for 3 vertices, 0.997 and 1.0 for 4 vertices, 0.997 and 1.0 for 5 vertices, 0.996 and 1.0 for 6 vertices, 0.996 and 1.0 for 7 vertices. +% In a \wide setting with three nodes, average quality ratios were observed as 0.98 for a window size of one, with a standard deviation of 0.014, and 0.998 for a window size of two, with a standard deviation of 0.005. Increasing the node count to four, the quality ratios are 0.97 for a window size of one (standard deviation = 0.019), 0.99 for a window size of two (standard deviation = 0.004), and 0.996 for a window size of three (standard deviation = 0.004). -For five nodes, the quality ratios extend as follows: 0.93 for a window size of one (standard deviation = 0.022), 0.97 for a window size of two (standard deviation = 0.015), 0.993 for a window size of three (standard deviation = 0.006), and 0.998 for a window size of four (standard deviation = 0.003). In a configuration with six nodes, the quality ratios are 0.92 for a window size of one (standard deviation = 0.028), 0.97 for a window size of two (standard deviation = 0.018), 0.995 for a window size of three (standard deviation = 0.004), 0.996 for a window size of four (standard deviation = 0.005), and 0.998 for a window size of five (standard deviation = 0.003). +% For five nodes, the quality ratios extend as follows: 0.93 for a window size of one (standard deviation = 0.022), 0.97 for a window size of two (standard deviation = 0.015), 0.993 for a window size of three (standard deviation = 0.006), and 0.998 for a window size of four (standard deviation = 0.003). In a configuration with six nodes, the quality ratios are 0.92 for a window size of one (standard deviation = 0.028), 0.97 for a window size of two (standard deviation = 0.018), 0.995 for a window size of three (standard deviation = 0.004), 0.996 for a window size of four (standard deviation = 0.005), and 0.998 for a window size of five (standard deviation = 0.003). -Finally, with seven nodes, the quality ratios are 0.90 for a window size of one (standard deviation = 0.016), 0.96 for a window size of two (standard deviation = 0.019), 0.97 for a window size of three (standard deviation = 0.010), 0.994 for a window size of four (standard deviation = 0.005), 0.997 for a window size of five (standard deviation = 0.003), and 0.999 for a window size of six (standard deviation = 0.003). +% Finally, with seven nodes, the quality ratios are 0.90 for a window size of one (standard deviation = 0.016), 0.96 for a window size of two (standard deviation = 0.019), 0.97 for a window size of three (standard deviation = 0.010), 0.994 for a window size of four (standard deviation = 0.005), 0.997 for a window size of five (standard deviation = 0.003), and 0.999 for a window size of six (standard deviation = 0.003). -In an \average setting with three nodes, the average quality ratios are 0.99 for a window size of one, with a standard deviation of 0.003, and 1.00 for a window size of two, with a standard deviation of 0.000. When the configuration includes four nodes and window sizes from one to three, the quality ratios are 0.98 (standard deviation = 0.010), 0.99 (standard deviation = 0.003), and 1.00 (standard deviation = 0.003). +% In an \average setting with three nodes, the average quality ratios are 0.99 for a window size of one, with a standard deviation of 0.003, and 1.00 for a window size of two, with a standard deviation of 0.000. When the configuration includes four nodes and window sizes from one to three, the quality ratios are 0.98 (standard deviation = 0.010), 0.99 (standard deviation = 0.003), and 1.00 (standard deviation = 0.003). -Expanding to five nodes, the quality ratios are 0.98 for a window size of one (standard deviation = 0.004), 0.99 for a window size of two (standard deviation = 0.003), 1.00 for both window sizes three and four (standard deviations = 0.004 and 0.000, respectively). In a configuration with six nodes and window sizes ranging from one to five, the quality ratios are 0.97 (standard deviation = 0.006), 0.98 (standard deviation = 0.003), and 1.00 for window sizes three through five (standard deviations = 0.000, 0.003, and 0.003). +% Expanding to five nodes, the quality ratios are 0.98 for a window size of one (standard deviation = 0.004), 0.99 for a window size of two (standard deviation = 0.003), 1.00 for both window sizes three and four (standard deviations = 0.004 and 0.000, respectively). In a configuration with six nodes and window sizes ranging from one to five, the quality ratios are 0.97 (standard deviation = 0.006), 0.98 (standard deviation = 0.003), and 1.00 for window sizes three through five (standard deviations = 0.000, 0.003, and 0.003). -For seven nodes, with window sizes extending from one to six, the quality ratios are 0.96 (standard deviation = 0.019), 0.98 (standard deviation = 0.009), 0.99 for both window sizes three and four (standard deviation = 0.005), and 1.00 for window sizes five and six (standard deviations = 0.003 and 0.000). +% For seven nodes, with window sizes extending from one to six, the quality ratios are 0.96 (standard deviation = 0.019), 0.98 (standard deviation = 0.009), 0.99 for both window sizes three and four (standard deviation = 0.005), and 1.00 for window sizes five and six (standard deviations = 0.003 and 0.000). -\hl{...FINO A QUI} +% \hl{...FINO A QUI} % We note that the benefit of an increasing window size can be appreciated with lower numbers, reaching a sort of saturation around the average length (e.g., window of length 6 with a 7-vertex pipeline) where the quality ratio overlaps. The only exception is for 6-vertex pipeline where the overapping starts with window size 2. However, this might be due to the specific setting and therefore does not generalize. % %Thus because the heuristic has more services to choose from and can find a better combination. diff --git a/main.tex b/main.tex index 80b4d17..59056c2 100644 --- a/main.tex +++ b/main.tex @@ -35,9 +35,9 @@ \definecolor{keywordsColor}{rgb}{0.000000, 0.000000, 0.635294} \definecolor{stringColor}{rgb}{0.558215, 0.000000, 0.135316} \theoremstyle{definition} -\newtheorem{definition}{Definition}[section] \newtheorem{theorem}{Theorem}[section] %\newtheorem{problem}{Problem}[section] +\newtheorem{definition}{Definition} \newtheorem{example}{Example}[section] \input{macro} diff --git a/metrics.tex b/metrics.tex index 670bd59..c756d95 100644 --- a/metrics.tex +++ b/metrics.tex @@ -53,7 +53,7 @@ \subsubsection{Information Loss} \end{definition} We note that \emph{AVG}($M_{ij}$) models the average data quality preserved within the pipeline instance $G'$ -We also note that \textit{dloss}$_{ij}$$=$1$-$$M_i$ models the quality loss at vertex \vii{i}$\in$$\V'_S$ of $G'$ for service \sii{j}. +We also note that \textit{dloss}$_{ij}$$=$1$-$$M_i$ models the quality loss at vertex \vii{i}$\in$$\V'_S$ of $G'$ for service \sii{j}. %We also note that information loss \textit{dloss} is used to generate the Max-Quality pipeline instance in the remaining of this section. \subsection{NP-Hardness of the Max-Quality Pipeline Instantiation Problem}\label{sec:nphard} @@ -136,17 +136,17 @@ \subsection{Heuristic}\label{subsec:heuristics} columns=fixed % Using fixed column width (for e.g. nice alignment) } -\begin{lstlisting}[frame=single,mathescape, caption={Sliding Window Heuristic with Selection of First Service from Optimal Combination},label={lst:slidingwindowfirstservice}] +\begin{lstlisting}[frame=single, escapechar=\%,mathescape, caption={Sliding Window Heuristic with Selection of First Service from Optimal Combination},label={lst:slidingwindowfirstservice}] var $\text{G'}$ = [] //pipeline instance $M$ = 0; //DATA QUALITY \hl{DEFINIZIONE VARIABILI NON DEFINITE NELLA METODOLOGIA} - - - function SlidingWindowHeuristic(G^{\myLambda,\myGamma}, \windowsize){ - for i = 1 to l - \windowsize + 1 + + + function SlidingWindowHeuristic(G^{%\myLambda%,%\myGamma%}, %\windowsize%){ + for i = 1 to l - %\windowsize% + 1 { - for j = i to i + \windowsize - 1 - $\text{G'}$ = $\text{G'}$ $\cup$ SelectService(j, \windowsize); + for j = i to i + %\windowsize% - 1 + $\text{G'}$ = $\text{G'}$ $\cup$ SelectService(j, %\windowsize%); } for j = 1 to $|V'_S|$ $M$=$M$+$M(\sii{j})$; @@ -154,12 +154,13 @@ \subsection{Heuristic}\label{subsec:heuristics} return $\text{G'}$, $M$; } - function SelectService(j,\windowsize){ - QUA DENTRO METTIAMO I PASSI CHE SERVONO PER CALCOLARE L'ISTANZA DEL PRIMO NODO DELLA FINESTRA. METTIAMO UN FOR PER TUTTE LE COMBINAZIONI DI VERTICI NELLA FINESTRA + function SelectService(j,%\windowsize%){ + QUA DENTRO METTIAMO I PASSI CHE SERVONO PER CALCOLARE L'ISTANZA DEL PRIMO NODO DELLA FINESTRA. + METTIAMO UN FOR PER TUTTE LE COMBINAZIONI DI VERTICI NELLA FINESTRA CALCOLIAMO M CON UN FOR CONTROLLIAMO LA METRICA, SE MINORE USIAMO QUELLA COMBINAZIONE ALTRIMENTI AVANTI - ALLA FINE SE รจ L'ULTIMA PASSO RITORNIAMO UNA LISTA DI |W| SERVIZI, ALTRIMENTI SOLO IL PRIMO + ALLA FINE SE e' L'ULTIMA PASSO RITORNIAMO UNA LISTA DI |W| SERVIZI, ALTRIMENTI SOLO IL PRIMO currentCombination = verticesList[windowIndex].services totalMetric = 0 for service in currentCombination{ @@ -171,12 +172,11 @@ \subsection{Heuristic}\label{subsec:heuristics} minMetricCombination = currentCombination } } + if isLastWindowFrame(){ - $\text{G'}$.append(minMetricCombination) - }else{ - if length(minMetricCombination) > 0 - $\text{G'}$.append(minMetricCombination[0]) - } + return minMetricCombination + + return minMetricCombination[0] } \end{lstlisting} diff --git a/pipeline_instance_example.tex b/pipeline_instance_example.tex index 19971f9..585b931 100644 --- a/pipeline_instance_example.tex +++ b/pipeline_instance_example.tex @@ -6,13 +6,13 @@ As presented in Table~\ref{tab:exisnt}(a), each vertex is labeled with policies (column \emph{candidate--$>$policy}) and then associated with different candidate services (column \emph{candidate}) and corresponding profile (column \emph{profile}). The filtering algorithm matches each candidate service profile with the policies in Table~\ref{tab:anonymization} annotating the corresponding vertex. It returns the set of services whose profile matches a policy (column \emph{filtering}): \begin{enumerate*}[label=\textit{\roman*})] - \item vertex \vi{6}, the filtering algorithm produces the set $S'_1=\{s_{61},s_{62}\}$. Assuming that the dataset owner is ``CT'', the service profile of \s{61} matches \p{1} and the one of \s{62} matches \p{2}. For \s{63}, there is no policy match and, thus, it is discarded; - \item vertex \vi{7}, the filtering algorithm returns the set $S'_2=\{s_{72},s_{73}\}$. Assuming that the dataset region is ``CT'', the service profile of \s{72} matches \p{5} and the one of \s{73} matches \p{6}. For \s{71}, there is no policy match and, thus, it is discarded; - \item vertex \vi{8}, the filtering algorithm returns the set $S'_3=\{s_{81},s_{82},s_{83}\}$. Since policy \p{7} matches with any subject, the filtering algorithm keeps all services. + \item vertex \vi{4}, the filtering algorithm produces the set $S'_1=\{s_{51},s_{52}\}$. Assuming that the dataset owner is ``CT'', the service profile of \s{61} matches \p{1} and the one of \s{62} matches \p{2}. For \s{63}, there is no policy match and, thus, it is discarded; + \item vertex \vi{5}, the filtering algorithm returns the set $S'_2=\{s_{62},s_{63}\}$. Assuming that the dataset region is ``CT'', the service profile of \s{72} matches \p{5} and the one of \s{73} matches \p{6}. For \s{71}, there is no policy match and, thus, it is discarded; + \item vertex \vi{6}, the filtering algorithm returns the set $S'_3=\{s_{71},s_{72},s_{73}\}$. Since policy \p{7} matches with any subject, the filtering algorithm keeps all services. \end{enumerate*} For each vertex \vii{i}, we select the matching service \sii{j} from $S'_i$ and incorporate it into a valid instance. For instance, we select \s{61} for \vi{6}; \s{72} for \vi{7}, and \s{81} for \vi{8} - as depicted in \cref{tab:instance_example_valid} (a) (column \emph{instance}). We note that to move from a valid to an optimal instance, it is mandatory to evaluate candidate services based on specific quality metrics that reflect their impact on data quality, as discussed in the following of this paper. + as depicted in \cref{tab:instance_example_valid} (a) (column \emph{instance}). We note that to move from a valid to an optimal instance, it is mandatory to evaluate candidate services based on specific quality metrics that reflect their impact on data quality, as discussed in the following of this paper. %In the next sections, we will introduce the metrics that we use to evaluate the quality of services and the results of the experiments conducted to evaluate the performance of our approach. % \begin{table*} @@ -47,32 +47,32 @@ \begin{tabular}{c|c|c|c|c}\label{tab:instance_example_valid} \textbf{Vertex$\rightarrow$Policy} & \textbf{Candidate} & \textbf{Profile} & \textbf{Filtering} & \textbf{Instance} \\\hline - \multirow{ 3}{*}{\vi{4} $\rightarrow$ \p{1},\p{2} } & $\s{41}$ & service\_owner = "CT" & \cmark & \cmark \\ - & $\s{42}$ & service\_owner = "NY" & \cmark & \xmark \\ - & $\s{43}$ & service\_owner = "CA" & \xmark & \xmark \\ + \multirow{ 3}{*}{\vi{5} $\rightarrow$ \p{1},\p{2} } & $\s{51}$ & service\_owner = "CT" & \cmark & \cmark \\ + & $\s{52}$ & service\_owner = "NY" & \cmark & \xmark \\ + & $\s{53}$ & service\_owner = "CA" & \xmark & \xmark \\ \hline - \multirow{ 3}{*}{\vi{5} $\rightarrow$ \p{5},\p{6} } & $\s{51}$ & service\_region = "CA" & \xmark & \xmark \\ - & $\s{52}$ & service\_region = "CT" & \cmark & \cmark \\ - & $\s{53}$ & service\_region = "NY" & \cmark & \xmark \\ + \multirow{ 3}{*}{\vi{6} $\rightarrow$ \p{3},\p{4} } & $\s{61}$ & service\_region = "CA" & \xmark & \xmark \\ + & $\s{62}$ & service\_region = "CT" & \cmark & \cmark \\ + & $\s{63}$ & service\_region = "NY" & \cmark & \xmark \\ \hline - \multirow{ 3}{*}{\vi{6} $\rightarrow$ \p{7},\p{8} } & $\s{61}$ & visualization\_location = "CT\_FACILITY" & \cmark & \cmark \\ - & $\s{62}$ & visualization\_location = "CLOUD" & \cmark & \xmark \\ + \multirow{ 3}{*}{\vi{7} $\rightarrow$ \p{5},\p{6} } & $\s{71}$ & visualization\_location = "CT\_FACILITY" & \cmark & \cmark \\ + & $\s{72}$ & visualization\_location = "CLOUD" & \cmark & \xmark \\ \end{tabular} & \begin{tabular}{c|c}\label{tab:instance_example_maxquality} \textbf{Candidate} & \textbf{Ranking} \\\hline - $\s{41}$ & 1 \\ - $\s{42}$ & 2 \\ - $\s{43}$ & -- \\ + $\s{51}$ & 1 \\ + $\s{52}$ & 2 \\ + $\s{53}$ & -- \\ \hline - $\s{51}$ & -- \\ - $\s{52}$ & 1 \\ - $\s{53}$ & 2 \\ + $\s{61}$ & -- \\ + $\s{62}$ & 1 \\ + $\s{63}$ & 2 \\ \hline - $\s{61}$ & 1 \\ - $\s{62}$ & 2 \\ + $\s{71}$ & 1 \\ + $\s{72}$ & 2 \\ \end{tabular} \\ (a) Valid Instance example & (b) Best Quality Instance example diff --git a/test.tikz b/test.tikz deleted file mode 100644 index 98f36f2..0000000 --- a/test.tikz +++ /dev/null @@ -1,6 +0,0 @@ - -\begin{tikzpicture} - \begin{axis}[grid] - - \end{axis} -\end{tikzpicture} diff --git a/text.pdf b/text.pdf deleted file mode 100644 index b7644930e0264d4212f54efe23c8a5283ff17ac2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25325 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