#!/usr/bin/env python3
|
|
|
|
from util import SATquboResult
|
|
import argparse
|
|
from util.kSAT import kSAT
|
|
from util import minisat as mSatU
|
|
from util import SATquboResult
|
|
import os
|
|
import json
|
|
|
|
def main():
|
|
args = __parseArguments()
|
|
|
|
|
|
comparison = __compare(args["instancePath"],
|
|
args["minisatResult"],
|
|
args["quboResult"])
|
|
|
|
outputFilePath = os.path.join(args["outputDir"],
|
|
args["instanceFileName"] + ".cmp")
|
|
|
|
__writeComparison(comparison, outputFilePath)
|
|
|
|
|
|
def __parseArguments():
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument("-i", "--instance", help="instance file, has to be in DIMACS format", type=str)
|
|
parser.add_argument("-m", "--minisat_result", help="Minisat result file", type=str)
|
|
parser.add_argument("-q", "--qubo_result", help="Qubo result file", type=str)
|
|
parser.add_argument("-o", "--output", help="Directory to store the comparison (optional)", type=str)
|
|
args = parser.parse_args()
|
|
|
|
arguments = {}
|
|
|
|
arguments["instancePath"] = args.instance
|
|
if arguments["instancePath"] == None:
|
|
arguments["instancePath"] = str(input("Instance file: "))
|
|
|
|
#arguments["instancePath"]
|
|
arguments["instanceFileName"] = os.path.basename(arguments["instancePath"])
|
|
|
|
arguments["minisatResult"] = args.minisat_result
|
|
if arguments["minisatResult"] == None:
|
|
arguments["minisatResult"] = str(input("Minisat result file: "))
|
|
|
|
arguments["quboResult"] = args.qubo_result
|
|
if arguments["quboResult"] == None:
|
|
arguments["quboResult"] = str(input("Qubo result file: "))
|
|
|
|
arguments["outputDir"] = args.output
|
|
if arguments["outputDir"] == None:
|
|
arguments["outputDir"] = str(input("Output directory: "))
|
|
|
|
arguments["outputDir"] = os.path.abspath(arguments["outputDir"])
|
|
|
|
|
|
|
|
return arguments
|
|
|
|
def __compare(instancePath, msatResultFile, quboResultFile):
|
|
comparison = {}
|
|
sat = kSAT()
|
|
sat.readDIMACS(instancePath)
|
|
|
|
comparison["instance"] = os.path.basename(instancePath)
|
|
comparison["minisat_satisfiable"] = __getMinisatSatisfiability(msatResultFile)
|
|
comparison["qubo_satisfiable"] = __getQuboSatisfiability(quboResultFile)
|
|
comparison["degrees_of_variables"] = sat.getDegreesOfVariables()
|
|
comparison["conflicts_per_variable"] = __countConflicts(sat.getConflicts())
|
|
|
|
return comparison
|
|
|
|
|
|
def __getMinisatSatisfiability(resultFile):
|
|
minisatResult = mSatU.readMinisatResult(resultFile)
|
|
|
|
return minisatResult["satisfiable"]
|
|
|
|
def __getQuboSatisfiability(resultFile):
|
|
results = SATquboResult.readResultsFromFile(resultFile)
|
|
|
|
for result in results:
|
|
if result.satisfiesInstance():
|
|
return True
|
|
|
|
return False
|
|
|
|
def __writeComparison(comparison, outputFilePath):
|
|
if outputFilePath == None:
|
|
return
|
|
|
|
outputFile = open(outputFilePath, "w+")
|
|
|
|
outputFile.write(json.dumps(comparison) + "\n")
|
|
|
|
outputFile.close()
|
|
|
|
def __countConflicts(conflicts):
|
|
conflictsPerVariable = {}
|
|
|
|
for conflict in conflicts:
|
|
varLabel = abs(conflict[0][1])
|
|
|
|
if varLabel not in conflictsPerVariable:
|
|
conflictsPerVariable[varLabel] = 1
|
|
else:
|
|
conflictsPerVariable[varLabel] += 1
|
|
|
|
return conflictsPerVariable
|
|
|
|
if __name__ == "__main__":
|
|
main()
|