You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

121 lines
3.7 KiB

#!/usr/bin/env python3
import argparse
import os
import glob
import json
import numpy as np
import matplotlib.pyplot as plt
import configparser
from util import script as scriptUtils
def main():
args = __parseArguments()
__stats(args["comparisonDir"], args["outputDir"])
def __parseArguments():
parser = scriptUtils.ArgParser()
parser.addInstanceDirArg()
parser.addArg(alias="comparisonDir", shortFlag="c", longFlag="comparison_dir",
help="the direcotry with all comparison files", type=str)
parser.addArg(alias="outputDir", shortFlag="s", longFlag="comparison_stats_dir",
help="Directory to store the stats", type=str)
arguments = parser.parse()
arguments["datasetDir"] = os.path.abspath(arguments["datasetDir"])
arguments["comparisonDir"] = os.path.join(arguments["datasetDir"],
arguments["comparisonDir"])
arguments["outputDir"] = os.path.join(arguments["datasetDir"],
arguments["outputDir"])
return arguments
def __stats(comparisonDir, outputDir):
runs = glob.glob(os.path.join(comparisonDir, "run*"))
for run in runs:
stats = __collectStats(run)
runOutputDir = os.path.join(outputDir, os.path.basename(run))
__writeStats(stats, runOutputDir)
def __collectStats(comparisonDir):
files = glob.glob(os.path.join(comparisonDir, "*.cmp"))
stats = {}
stats["match"] = 0
stats["false_positive"] = 0
stats["false_negative"] = 0
stats["unsat"] = 0
for path in files:
comparison = __readComparison(path)
minisat_satisfiable = comparison["minisat_satisfiable"]
qubo_satisfiable = comparison["qubo_satisfiable"]
if minisat_satisfiable == qubo_satisfiable:
stats["match"] += 1
elif minisat_satisfiable == False and qubo_satisfiable == True:
stats["false_positive"] += 1
elif minisat_satisfiable == True and qubo_satisfiable == False:
stats["false_negative"] += 1
if not minisat_satisfiable:
stats["unsat"] += 1
return stats
def __readComparison(path):
cmpFile = open(path, "r")
comparison = json.load(cmpFile)
cmpFile.close()
return comparison
def __writeStats(stats, outputDir):
if not os.path.exists(outputDir):
os.makedirs(outputDir)
fig = plt.figure()
ax = fig.add_subplot(111)
numInstances = stats["match"] + stats["false_negative"] + stats["false_positive"]
matchBar = ax.bar(x=0, height=stats["match"])
falsePositiveBar = ax.bar(x=1, height=stats["false_positive"])
falseNegativeBar = ax.bar(x=1,
height=stats["false_negative"],
bottom=stats["false_positive"])
ax.axhline(y=stats["match"], linestyle="--", color="gray")
ax.axhline(y=stats["false_negative"], linestyle="--", color="gray")
plt.ylabel("SAT Instanzen")
plt.title("Verlgeich Minisat / WMIS qubo mit qbsolv")
plt.xticks([0, 1], ("Gleiches Ergebnis", "Unterschiedliches Ergebnis"))
plt.yticks([0, stats["match"], stats["false_negative"], numInstances])
plt.legend((matchBar, falsePositiveBar, falseNegativeBar),
("Gleiches Ergebnis",
"False Positive",
"False Negative"))
plt.savefig(os.path.join(outputDir, "stats.png"))
if __name__ == "__main__":
main()