|
|
- #!/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()
|