From ea283caa94b135e59edb32ae0ea45a1728a898b6 Mon Sep 17 00:00:00 2001 From: gospodnetic <petra.gospodnetic@gmail.com> Date: Fri, 5 Jun 2020 09:03:16 +0200 Subject: [PATCH] Output best results to the table --- Benchmark.py | 14 +++++------ LogContainer.py | 67 ++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 68 insertions(+), 13 deletions(-) diff --git a/Benchmark.py b/Benchmark.py index f3d3233..41edbe9 100644 --- a/Benchmark.py +++ b/Benchmark.py @@ -57,16 +57,16 @@ class Benchmark: tex_file.write("\n& \makecell{{{}}}".format(method)) for model in models: - # self.log_container_per_model[model].get_best_log() - logs = self.log_container_per_model[model].get_logs_by_method(method) - if len(logs) == 0: + try: + best_log = self.log_container_per_model[model].get_best_log(method) + except: tex_file.write(" & - & - & - & -") continue - VPC_count = logs[0].VPC["count"] + logs[0].VPC["discarded_count"] - VPC_used = logs[0].VPC["count"] - OVP = len(logs[0].optimization["OVP"]) - coverage = util.set_precision(logs[0].coverage["percent_fraction"] * 100, 2) + VPC_count = best_log.VPC["count"] + best_log.VPC["discarded_count"] + VPC_used = best_log.VPC["count"] + OVP = len(best_log.optimization["OVP"]) + coverage = util.set_precision(best_log.coverage["percent_fraction"] * 100, 2) tex_file.write(" & {} & {} & {} & {}".format(VPC_count, VPC_used, OVP, coverage)) tex_file.write("\\\\") diff --git a/LogContainer.py b/LogContainer.py index 00acc9c..9db4a20 100644 --- a/LogContainer.py +++ b/LogContainer.py @@ -1,5 +1,6 @@ import Log import pprint +from enum import Enum class LogContainer: def __init__(self, methods_per_approach): @@ -13,12 +14,6 @@ class LogContainer: self.__parse_methods_per_approach() - def __parse_methods_per_approach(self): - self.approaches_per_method = {} - for approach in self.methods_per_approach: - for method in self.methods_per_approach[approach]: - self.approaches_per_method[method] = approach - def add_log(self, log): method = log.VPC["method"] if method in self.approaches_per_method: @@ -51,3 +46,63 @@ class LogContainer: method_logs.append(log) return method_logs + + # Log which obtains coverage over 99% with minimal number of viewpoint candidates + # If no log obrains coverage over 99%, the log with the greatest coverage is considered. + def get_best_log(self, method): + method_logs = self.get_logs_by_method(method) + if len(method_logs) == 0: + raise Exception("Error: No logs available for given method ({})".format(method)) + + # Find logs with coverage >99%. + high_coverage_logs = self.__filter_coverage_threshold(method_logs, 0.99, ComparisonType.GEQ) + + if len(high_coverage_logs) > 0: + return self.max_coverage_log(high_coverage_logs) + else: + return self.max_coverage_log(method_logs) + + def max_coverage_log(self, input_logs=None): + if not input_logs: + input_logs = self.logs + if len(input_logs) == 0: + raise Exception("Error: no logs available.") + + max_coverage = input_logs[0].coverage["percent_fraction"] + max_log = input_logs[0] + for log in input_logs: + if log.coverage["percent_fraction"] > max_coverage: + max_log = log + return max_log + + def __parse_methods_per_approach(self): + self.approaches_per_method = {} + for approach in self.methods_per_approach: + for method in self.methods_per_approach[approach]: + self.approaches_per_method[method] = approach + + # Find logs which have coverage greater or equal to the given threshold. + # threshold is given as a fraction (e.g. 0.99) + def __filter_coverage_threshold(self, input_logs, threshold, comparison_type): + filtered_logs = [] + for log in input_logs: + if comparison_type == ComparisonType.G: + if log.coverage["percent_fraction"] > threshold: + filtered_logs.append(log) + elif comparison_type == ComparisonType.GEQ: + if log.coverage["percent_fraction"] >= threshold: + filtered_logs.append(log) + elif comparison_type == ComparisonType.LEQ: + if log.coverage["percent_fraction"] <= threshold: + filtered_logs.append(log) + elif comparison_type == ComparisonType.L: + if log.coverage["percent_fraction"] < threshold: + filtered_logs.append(log) + + return filtered_logs + +class ComparisonType(Enum): + G = 0 # > + GEQ = 1 # >= + LEQ = 2 # <= + L = 3 # < -- GitLab