This is a supplementary report for the paper “A Preliminary Analysis on the Effect of Randomness in a CEGAR Framework” by Akos Hajdu and Zoltan Micskei, presented at the 25th PhD Mini-Symposium (2018), organized by the Department of Measurement and Information Systems at the Budapest University of Technology and Economics.
library(tidyverse)
library(stringr)
library(gridExtra)
library(GGally)
theme_rotate_x <- theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5))
theme_noticks <- theme(axis.ticks = element_blank())
fill_heat <- scale_fill_gradient(low = "green", high = "red", na.value = "white")
percent <- function(actual, total, round = 0) { round(actual / total * 100, digits = round) }
d <- read_csv(
params$csv_path,
col_types = cols(
Model = col_character(),
Domain = col_character(),
Refinement = col_character(),
Search = col_character(),
RandomVars = col_character(),
Result = col_character(),
TimeMs = col_integer(),
Iterations = col_integer(),
ArgSize = col_integer(),
ArgDepth = col_integer(),
ArgMeanBranchFactor = col_double(),
CexLen = col_integer()
)
)
d_model_attrs <- read_csv(
params$models_csv_path,
col_types = cols(
Model = col_character(),
Inputs = col_integer(),
Latches = col_integer(),
AndGates = col_integer(),
Vars = col_integer(),
Locations = col_integer(),
Edges = col_integer(),
Assigns = col_integer(),
Assumes = col_integer(),
Havocs = col_integer()
)
)
d$Domain <- factor(d$Domain)
d$Refinement <- gsub("BW_BIN_ITP", "BIN", d$Refinement)
d$Refinement <- gsub("SEQ_ITP", "SEQ", d$Refinement)
d$Refinement <- factor(d$Refinement)
d$RandomVars <- as.logical(d$RandomVars)
# Combine RandomVars and Search into a single column
d <- d %>% mutate(Randomized = ifelse(RandomVars, "VARS", ifelse(Search == "RND", "SEARCH", "DET")))
d <- d %>% select(-Search, -RandomVars)
d$Randomized <- factor(d$Randomized)
# Create 'Config' column
d <- d %>% mutate(Config = paste(
substr(Domain, 1, 1),
substr(Refinement, 1, 1),
"-",
substr(Randomized, 1, 1),
sep = ""
))
d$Config <- factor(d$Config)
all_params <- c("Randomized", "Domain", "Refinement")
# Convert 'Result' to logical (and remove exceptions)
n_rows_empty <- sum(is.na(d$Result))
n_rows_exception <- nrow(d %>% filter(str_detect(d$Result, "\\[EX\\]")))
d$Result <- as.logical(d$Result)
# Shorten model names by removing irrelevant details
simplify_name <- function(name) {
name <- gsub("../models/cfa/", "", name)
name <- gsub("../models/sts/", "", name)
name <- gsub("\\.cfa", "", name)
name <- gsub("\\.aag", "", name)
name <- gsub("hwmcc", "hw", name)
name <- gsub("-unreach-call", "", name)
name <- gsub("_true", "", name)
name <- gsub("_false", "", name)
name <- gsub("\\.c", "", name)
name <- gsub("Problem0", "prob", name)
name <- gsub("label", "lab", name)
name <- gsub("(ssh/.*)_0", "\\1", name)
name <- gsub("(eca/.*)_0", "\\1", name)
name
}
d$Model <- simplify_name(d$Model)
d_model_attrs$Model <- simplify_name(d_model_attrs$Model)
# Determine category
d <- d %>% mutate(Category = sub("/([^/]*)$","", d$Model))
d$Model <- as.factor(d$Model)
str(d)
## Classes 'tbl_df', 'tbl' and 'data.frame': 10800 obs. of 13 variables:
## $ Model : Factor w/ 30 levels "eca/prob1_lab15",..: 14 14 14 14 14 14 14 14 14 14 ...
## $ Domain : Factor w/ 2 levels "EXPL","PRED": 1 1 1 1 1 1 1 1 1 1 ...
## $ Refinement : Factor w/ 2 levels "BIN","SEQ": 2 2 2 2 2 2 2 2 2 2 ...
## $ Result : logi TRUE TRUE TRUE TRUE TRUE TRUE ...
## $ TimeMs : int 28290 27241 27859 27581 27146 27307 27271 27633 27208 27318 ...
## $ Iterations : int 2 2 2 2 2 2 2 2 2 2 ...
## $ ArgSize : int 2 2 2 2 2 2 2 2 2 2 ...
## $ ArgDepth : int 1 1 1 1 1 1 1 1 1 1 ...
## $ ArgMeanBranchFactor: num 1 1 1 1 1 1 1 1 1 1 ...
## $ CexLen : int NA NA NA NA NA NA NA NA NA NA ...
## $ Randomized : Factor w/ 3 levels "DET","SEARCH",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ Config : Factor w/ 12 levels "EB-D","EB-S",..: 4 4 4 4 4 4 4 4 4 4 ...
## $ Category : chr "hw" "hw" "hw" "hw" ...
n_meas_rep_total <- nrow(d)
n_meas_rep_succ <- nrow(d %>% filter(!is.na(Result)))
n_models_total <- length(unique(d$Model))
n_configs_total <- length(unique(d$Config))
categories <- unique(d$Category)
n_categories <- length(categories)
n_rows_problem <- n_rows_empty + n_rows_exception
d_model_config <- d %>%
group_by_(.dots = c("Config", "Model", "Category", all_params)) %>%
summarise(
Reps = n(),
SuccCount = sum(!is.na(Result)),
SuccSD = sd(!is.na(Result)),
Succ = SuccCount > 0,
TimeMsAvg = mean(TimeMs, na.rm = T),
TimeMsRSD = ifelse(SuccCount == 1, 0, sd(TimeMs, na.rm = T) / TimeMsAvg),
IterationsAvg = mean(Iterations, na.rm = T),
IterationsRSD = ifelse(SuccCount == 1, 0, sd(Iterations, na.rm = T) / IterationsAvg),
ArgSizeAvg = mean(ArgSize, na.rm = T),
ArgSizeRSD = ifelse(SuccCount == 1, 0, sd(ArgSize, na.rm = T) / ArgSizeAvg),
ArgDepthAvg = mean(ArgDepth, na.rm = T),
ArgDepthRSD = ifelse(SuccCount == 1, 0, sd(ArgDepth, na.rm = T) / ArgDepthAvg),
CexLenRSD = ifelse(sum(!is.na(CexLen)) == 0, NA, ifelse(sum(!is.na(CexLen)) == 1, 0, sd(CexLen, na.rm = T) / mean(CexLen, na.rm = T)))
)
n_meas_total <- nrow(d_model_config)
n_meas_succ <- nrow(d_model_config %>% filter(Succ))
if (n_meas_total != n_models_total * n_configs_total) {
warning(sprintf("%d models * %d configs = %d expected measurements, but there are %d actual measurements",
n_models_total, n_configs_total, n_models_total * n_configs_total, n_meas_total))
}
d_model <- d_model_config %>% group_by_("Model", "Category") %>%
summarise(
SuccRunCount = sum(SuccCount),
SuccCount = sum(Succ),
Succ = SuccCount > 0)
n_models_succ <- nrow(d_model %>% filter(Succ))
d_config <- d_model_config %>%
group_by_(.dots = c("Config", all_params)) %>%
summarise(
SuccRunCount = sum(SuccCount),
SuccCount = sum(Succ))
Terminology
Results
There are 389 empty results (no timeout, no exception). This usually happens when the SMT solver crashes.
There are 0 exceptions.
if (n_rows_exception > 0) {
knitr::kable(d_exceptions %>% group_by(Type = Result) %>% summarise(Configs = toString(unique(Config)), Count = n()))
}
The 30 models are distributed in the 5 categories in the following way.
ggplot(d_model) +
geom_bar(aes(x = Category, fill = Category)) +
coord_flip() + guides(fill = F) +
scale_fill_brewer(palette = "Set1") +
ggtitle("Distribution of models among the categories")
The following plots show for each model the number of successful runs and the number of configurations that verified them.
grid.arrange(
ggplot(d_model) +
geom_point(aes(reorder(Model, -SuccRunCount), SuccRunCount, color = Category), size = 2) +
theme_rotate_x + scale_color_brewer(palette = "Set1") +
labs(x = "Model", y = "Successful runs", title = "Number of successful runs for the models"),
ggplot(d_model) +
geom_point(aes(reorder(Model, -SuccCount), SuccCount, color = Category), size = 2) +
theme_rotate_x + scale_color_brewer(palette = "Set1") +
coord_cartesian(ylim = c(0, n_configs_total)) +
labs(x = "Model", y = "Verified by", title = "Number of configs that verified the models"),
ncol = 2)
The following table summarizes the attributes of the models. Hardware models can be described by the number of hardware elements, while software and PLC models can be described by the number of control locations and statements.
knitr::kable(d_model_attrs %>% select(Model, Inputs, Latches, AndGates) %>% filter(!is.na(Inputs)))
| Model | Inputs | Latches | AndGates |
|---|---|---|---|
| hw/139444p22 | 244 | 322 | 5549 |
| hw/6s282b01 | 44 | 637 | 3185 |
| hw/beemadd3b1 | 60 | 56 | 876 |
| hw/bj08amba4g5 | 11 | 33 | 13585 |
| hw/bobtuint12neg | 212 | 207 | 1937 |
| hw/intel001 | 31 | 23 | 240 |
| hw/mentorbm1p04 | 100 | 2373 | 17508 |
| hw/oski15a14b16s | 1023 | 3451 | 33367 |
| hw/pdtvistwoall1 | 6 | 31 | 725 |
| hw/texaspimainp08 | 14 | 42 | 1955 |
knitr::kable(d_model_attrs %>% select(Model, Locations, Edges, Assigns, Assumes, Havocs) %>% filter(!is.na(Locations)))
| Model | Locations | Edges | Assigns | Assumes | Havocs |
|---|---|---|---|---|---|
| eca/prob1_lab15 | 317 | 393 | 236 | 156 | 1 |
| eca/prob1_lab19 | 322 | 403 | 236 | 166 | 1 |
| eca/prob2_lab57 | 312 | 408 | 211 | 196 | 1 |
| eca/prob3_lab03 | 1261 | 1436 | 1081 | 354 | 1 |
| eca/prob3_lab48 | 1280 | 1474 | 1081 | 392 | 1 |
| locks/locks_10_2 | 26 | 36 | 10 | 24 | 2 |
| locks/locks_11_8 | 16 | 21 | 5 | 14 | 2 |
| locks/locks_14_1 | 9 | 10 | 2 | 6 | 2 |
| locks/locks_15_0 | 9 | 10 | 2 | 6 | 2 |
| locks/locks_5_4 | 13 | 16 | 4 | 10 | 2 |
| plc/plc1 | 66 | 70 | 51 | 11 | 8 |
| plc/plc2 | 175 | 196 | 135 | 40 | 21 |
| plc/plc3 | 175 | 196 | 135 | 40 | 21 |
| plc/plc4a | 175 | 196 | 135 | 40 | 21 |
| plc/plc4b | 175 | 196 | 135 | 40 | 21 |
| ssh/s3_clnt_1 | 187 | 262 | 79 | 154 | 29 |
| ssh/s3_clnt_3 | 193 | 268 | 85 | 154 | 29 |
| ssh/s3_srvr_1 | 233 | 323 | 102 | 184 | 37 |
| ssh/s3_srvr_3 | 230 | 320 | 100 | 184 | 36 |
| ssh/s3_srvr_4 | 230 | 320 | 100 | 184 | 36 |
Configurations are listed in the following table with their abbreviation, parameters, successful runs and verified models.
knitr::kable(d_config)
| Config | Randomized | Domain | Refinement | SuccRunCount | SuccCount |
|---|---|---|---|---|---|
| EB-D | DET | EXPL | BIN | 622 | 21 |
| EB-S | SEARCH | EXPL | BIN | 618 | 22 |
| EB-V | VARS | EXPL | BIN | 573 | 21 |
| ES-D | DET | EXPL | SEQ | 570 | 19 |
| ES-S | SEARCH | EXPL | SEQ | 629 | 22 |
| ES-V | VARS | EXPL | SEQ | 582 | 21 |
| PB-D | DET | PRED | BIN | 656 | 22 |
| PB-S | SEARCH | PRED | BIN | 518 | 24 |
| PB-V | VARS | PRED | BIN | 685 | 25 |
| PS-D | DET | PRED | SEQ | 544 | 19 |
| PS-S | SEARCH | PRED | SEQ | 534 | 22 |
| PS-V | VARS | PRED | SEQ | 549 | 23 |
The following plots show the number of models verified and the successful runs by each config. The number of models verified ranges between 19 and 25, while the number of successful runs is between 518 and 685.
grid.arrange(
ggplot(d_config) +
geom_bar(aes(reorder(Config, SuccCount), SuccCount, fill = Randomized), stat = "identity") +
theme_rotate_x + scale_fill_brewer(palette = "Set1") +
labs(x = "Config", y = "Models verified", title = "Number of models verified by each config"),
ggplot(d_config) +
geom_bar(aes(reorder(Config, SuccRunCount), SuccRunCount, fill = Randomized), stat = "identity") +
theme_rotate_x + scale_fill_brewer(palette = "Set1") +
labs(x = "Config", y = "Succ. runs", title = "Number of successful runs by each config"),
ncol = 2)
The following plot compares the number of verified models to the number of successful runs for each configuration.
ggplot(d_config) +
geom_point(aes(SuccCount, SuccRunCount, color = Randomized)) +
scale_color_brewer(palette = "Set1") +
labs(x = "Number of models verified", y = "Number of succ. runs")
The following histograms show an overview on the range of the output metrics colored by the category.
grid.arrange(
ggplot(d) + geom_bar(aes(!is.na(Result), fill = Category)) + xlab("Succ") + scale_fill_brewer(palette = "Set1"),
ggplot(d) + geom_histogram(aes(TimeMs, fill = Category), na.rm = T) + scale_x_log10() + scale_fill_brewer(palette = "Set1"),
ggplot(d) + geom_histogram(aes(Iterations, fill = Category), na.rm = T) + scale_x_log10() + scale_fill_brewer(palette = "Set1"),
ggplot(d) + geom_histogram(aes(ArgSize, fill = Category), na.rm = T) + scale_x_log10() + scale_fill_brewer(palette = "Set1"),
ggplot(d) + geom_histogram(aes(ArgDepth, fill = Category), na.rm = T) + scale_x_log10() + scale_fill_brewer(palette = "Set1"),
ggplot(d) + geom_histogram(aes(CexLen, fill = Category), na.rm = T) + scale_x_log10() + scale_fill_brewer(palette = "Set1"),
ncol = 2)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
The following scatterplot matrix shows the numerical output metrics.
ggpairs(d %>% filter(!is.na(Result)) %>% select(TimeMs, Iterations, ArgSize, ArgDepth, CexLen))
## Warning in (function (data, mapping, alignPercent = 0.6, method =
## "pearson", : Removed 4546 rows containing missing values
## Warning in (function (data, mapping, alignPercent = 0.6, method =
## "pearson", : Removed 4546 rows containing missing values
## Warning in (function (data, mapping, alignPercent = 0.6, method =
## "pearson", : Removed 4546 rows containing missing values
## Warning in (function (data, mapping, alignPercent = 0.6, method =
## "pearson", : Removed 4546 rows containing missing values
## Warning: Removed 4546 rows containing missing values (geom_point).
## Warning: Removed 4546 rows containing missing values (geom_point).
## Warning: Removed 4546 rows containing missing values (geom_point).
## Warning: Removed 4546 rows containing missing values (geom_point).
## Warning: Removed 4546 rows containing non-finite values (stat_density).
The following heatmaps show for each measurement whether it was successful (at least one successful run) and the number of successful executions (if there were any). In the latter plot, those measurements are marked (with circles for randomized search and triangles for randomized variable names) where a randomized configuration verified a model that its deterministic counterpart could not.
d_model_config2 <- d_model_config %>% ungroup() %>%
select(Config, Model, Randomized, Domain, Refinement, SuccCount)
d_model_config2 <- inner_join(
d_model_config2,
d_model_config2 %>% filter(Randomized == "DET"),
by = c("Model", "Domain", "Refinement")) %>%
mutate(Marked = ifelse((SuccCount.x > 0) & (SuccCount.y == 0), ifelse(Randomized.x == "VARS", "V", "S"), NA))
d_model_config$Marked <- d_model_config2$Marked
grid.arrange(
ggplot(d_model_config, aes(Config, Model)) +
geom_tile(aes(fill = Succ), color = "black") +
theme_noticks + theme_rotate_x +
ggtitle("At least one successful run"),
ggplot(d_model_config, aes(Config, Model)) +
geom_tile(aes(fill = ifelse(SuccCount > 0, SuccCount, NA)), color = "black") +
geom_point(aes(shape = Marked), na.rm = T) + guides(shape=F) +
theme_noticks + theme_rotate_x +
scale_fill_gradient(low = "red", high = "green", na.value = "white", limits = c(1, NA), breaks = c(1, 10, 20, 30)) +
labs(title = "Number of successful runs", fill = "Count"),
ncol = 2)
det_succ <- unique((d %>% filter(!is.na(Result)) %>% filter(Randomized == "DET"))$Model)
rnd_succ <- unique((d %>% filter(!is.na(Result)) %>% filter(Randomized != "DET"))$Model)
det_only <- setdiff(det_succ, rnd_succ)
rnd_only <- setdiff(rnd_succ, det_succ)
There are 0 models that were only verified by deterministic configs: .
There are 3 models that were only verified by randomized configs: hw/139444p22, hw/intel001, ssh/s3_srvr_4.
For each measurement, there are multiple runs, forming a distribution over the output metrics.
The following plots show the distributions of the output metrics for each measurement individually.
ggplot(d) +
geom_bar(aes(!is.na(Result), fill = Randomized)) +
facet_grid(Model ~ Config) +
theme_bw() + theme(strip.text.y = element_text(angle = 0)) + theme_rotate_x +
scale_fill_brewer(palette = "Set1") +
labs(x = "Succ", title = "Distributions of successful executions")
ggplot(d) +
geom_histogram(aes(TimeMs, fill = Randomized), bins = 15, na.rm = T) +
facet_grid(Model ~ Config) +
theme_bw() + theme(strip.text.y = element_text(angle = 0)) + theme_rotate_x +
scale_x_log10() + scale_fill_brewer(palette = "Set1") +
ggtitle("Distributions of execution time")
ggplot(d) +
geom_histogram(aes(Iterations, fill = Randomized), bins = 15, na.rm = T) +
facet_grid(Model ~ Config) +
theme_bw() + theme(strip.text.y = element_text(angle = 0)) + theme_rotate_x +
scale_x_log10() + scale_fill_brewer(palette = "Set1") +
ggtitle("Distributions of iterations")
ggplot(d) +
geom_histogram(aes(ArgSize, fill = Randomized), bins = 15, na.rm = T) +
facet_grid(Model ~ Config) +
theme_bw() + theme(strip.text.y = element_text(angle = 0)) + theme_rotate_x +
scale_x_log10() + scale_fill_brewer(palette = "Set1") +
ggtitle("Distributions of ARG size")
ggplot(d) +
geom_histogram(aes(ArgDepth, fill = Randomized), bins = 15, na.rm = T) +
facet_grid(Model ~ Config) +
theme_bw() + theme(strip.text.y = element_text(angle = 0)) + theme_rotate_x +
scale_x_log10() + scale_fill_brewer(palette = "Set1") +
ggtitle("Distributions of ARG depth")
ggplot(d) +
geom_histogram(aes(CexLen, fill = Randomized), bins = 15, na.rm = T) +
facet_grid(Model ~ Config) +
theme_bw() + theme(strip.text.y = element_text(angle = 0)) + theme_rotate_x +
scale_x_log10() + scale_fill_brewer(palette = "Set1") +
ggtitle("Distributions of cex. length")
In this research question we are mainly interested in the deviations of the distributions. The following heatmaps summarize the deviations for each measurement and each output metric. The SuccSD variable shows the standard deviation of the success of the verification (0: false, 1: true). Other metrics correspont to the relative standard deviation (RSD = SD / mean) of the output metrics.
grid.arrange(
ggplot(d_model_config, aes(Config, Model)) +
geom_tile(aes(fill = SuccSD), color = "black") +
theme_noticks + theme_rotate_x +
fill_heat + ggtitle("Success SD"),
ggplot(d_model_config, aes(Config, Model)) +
geom_tile(aes(fill = TimeMsRSD), color = "black") +
theme_noticks + theme_rotate_x +
fill_heat + ggtitle("Time RSD"),
ggplot(d_model_config, aes(Config, Model)) +
geom_tile(aes(fill = IterationsRSD), color = "black") +
theme_noticks + theme_rotate_x +
fill_heat + ggtitle("Iterations RSD"),
ggplot(d_model_config, aes(Config, Model)) +
geom_tile(aes(fill = ArgSizeRSD), color = "black") +
theme_noticks + theme_rotate_x +
fill_heat + ggtitle("ARG size RSD"),
ggplot(d_model_config, aes(Config, Model)) +
geom_tile(aes(fill = ArgDepthRSD), color = "black") +
theme_noticks + theme_rotate_x +
fill_heat + ggtitle("ARG depth RSD"),
ggplot(d_model_config, aes(Config, Model)) +
geom_tile(aes(fill = CexLenRSD), color = "black") +
theme_noticks + theme_rotate_x +
fill_heat + ggtitle("Counterexample length RSD"),
ncol = 2)
The following plots summarize the distribution of the deviations, grouped by the parameter that is randomized.
grid.arrange(
ggplot(d_model_config) + geom_boxplot(aes(x = Randomized, y = SuccSD), na.rm = T) + theme_rotate_x,
ggplot(d_model_config) + geom_boxplot(aes(x = Randomized, y = TimeMsRSD), na.rm = T) + theme_rotate_x,
ggplot(d_model_config) + geom_boxplot(aes(x = Randomized, y = IterationsRSD), na.rm = T) + theme_rotate_x,
ggplot(d_model_config) + geom_boxplot(aes(x = Randomized, y = ArgSizeRSD), na.rm = T) + theme_rotate_x,
ggplot(d_model_config) + geom_boxplot(aes(x = Randomized, y = ArgDepthRSD), na.rm = T) + theme_rotate_x,
ggplot(d_model_config) + geom_boxplot(aes(x = Randomized, y = CexLenRSD), na.rm = T) + theme_rotate_x,
ncol = 6)
The following plot shows the same data, but using a uniform y axis scale.
d_model_config2 <- d_model_config %>%
gather("Metric", "Deviation", SuccSD, TimeMsRSD, IterationsRSD, ArgSizeRSD, ArgDepthRSD, CexLenRSD)
ggplot(d_model_config2) +
geom_boxplot(aes(Metric, Deviation, color = Randomized), na.rm = T)
The following plot shows the same data, but outliers above 1.2 are trimmed (there are 5 of them).
ggplot(d_model_config2 %>% filter(Deviation < 1.2)) +
geom_boxplot(aes(Metric, Deviation, color = Randomized), na.rm = T)
The following parallel coordinate plots show the deviations of each output metric, where each line corresponds to a measurement.
grid.arrange(
ggparcoord(d_model_config %>% ungroup() %>% filter(Randomized == "SEARCH") %>%
select(TimeMsRSD, IterationsRSD, ArgSizeRSD, ArgDepthRSD, CexLenRSD)) +
ggtitle("RSDs for randomized search"),
ggparcoord(d_model_config %>% ungroup() %>% filter(Randomized == "VARS") %>%
select(TimeMsRSD, IterationsRSD, ArgSizeRSD, ArgDepthRSD, CexLenRSD)) +
ggtitle("RSDs for randomized variables"),
ncol = 2)
The following table shows the mean values of the deviations for each output metric grouped by the parameter that is randomized.
knitr::kable(d_model_config %>% group_by(Randomized) %>% summarize(
Succ = mean(SuccSD, na.rm = T),
TimeMs = mean(TimeMsRSD, na.rm = T),
Iterations = mean(IterationsRSD, na.rm = T),
ArgSize = mean(ArgSizeRSD, na.rm = T),
ArgDepth = mean(ArgDepthRSD, na.rm = T),
CexLen = mean(CexLenRSD, na.rm = T)
), caption = "Mean value of the deviations")
| Randomized | Succ | TimeMs | Iterations | ArgSize | ArgDepth | CexLen |
|---|---|---|---|---|---|---|
| DET | 0.0132587 | 0.0326082 | 0.0000000 | 0.0000000 | 0.0000000 | 0.0000000 |
| SEARCH | 0.0652476 | 0.1948332 | 0.0856263 | 0.1641061 | 0.0757643 | 0.0098402 |
| VARS | 0.0551681 | 0.1447746 | 0.0282938 | 0.1409662 | 0.0409520 | 0.0081250 |
The following table shows the mean values of the deviations for each output metric for each configuration.
knitr::kable(d_model_config %>% group_by(Config) %>% summarize(
Succ = mean(SuccSD, na.rm = T),
TimeMs = mean(TimeMsRSD, na.rm = T),
Iterations = mean(IterationsRSD, na.rm = T),
ArgSize = mean(ArgSizeRSD, na.rm = T),
ArgDepth = mean(ArgDepthRSD, na.rm = T),
CexLen = mean(CexLenRSD, na.rm = T)
), caption = "Mean value of the deviations")
| Config | Succ | TimeMs | Iterations | ArgSize | ArgDepth | CexLen |
|---|---|---|---|---|---|---|
| EB-D | 0.0149925 | 0.0318736 | 0.0000000 | 0.0000000 | 0.0000000 | 0.0000000 |
| EB-S | 0.0309747 | 0.1130352 | 0.1113018 | 0.1039979 | 0.0685456 | 0.0112486 |
| EB-V | 0.0683914 | 0.1843390 | 0.0394242 | 0.2805611 | 0.0975525 | 0.0000000 |
| ES-D | 0.0000000 | 0.0330502 | 0.0000000 | 0.0000000 | 0.0000000 | 0.0000000 |
| ES-S | 0.0182574 | 0.1560224 | 0.0769143 | 0.1800610 | 0.1006171 | 0.0040703 |
| ES-V | 0.0313430 | 0.0641824 | 0.0043733 | 0.0381368 | 0.0138147 | 0.0304686 |
| PB-D | 0.0115249 | 0.0318854 | 0.0000000 | 0.0000000 | 0.0000000 | 0.0000000 |
| PB-S | 0.0878830 | 0.1376548 | 0.0476057 | 0.0979967 | 0.0533533 | 0.0070693 |
| PB-V | 0.0496457 | 0.1849910 | 0.0470859 | 0.1368538 | 0.0277514 | 0.0000000 |
| PS-D | 0.0265174 | 0.0338148 | 0.0000000 | 0.0000000 | 0.0000000 | 0.0000000 |
| PS-S | 0.1238753 | 0.3778186 | 0.1101400 | 0.2803788 | 0.0825784 | 0.0160288 |
| PS-V | 0.0712922 | 0.1385212 | 0.0195455 | 0.1118677 | 0.0283993 | 0.0000000 |