|
|
- #!/usr/bin/env python3
-
- import kSAT
- import SAT2QUBO
- from SATquboResult import SATquboResult
- import argparse
- from dwave_qbsolv import QBSolv
- import os
- import collections
- import json
- from tqdm import tqdm
- import scriptUtils
-
- def main():
- arguments = __parseArguments()
-
- satInstance = kSAT.kSAT()
-
- print("reading ksat...")
- satInstance.readDIMACS(arguments["instancePath"])
-
- print()
- result = __runWMISquboOnSatInstance(satInstance)
-
- resultPath = os.path.join(
- os.path.join(arguments["resultDir"],
- "run%d" % arguments["run"]),
- "%s.out" % arguments["instanceFileName"])
-
- print()
- print("writing results to file...")
- __writeResult(result, resultPath)
-
- def __parseArguments():
- parser = scriptUtils.ArgParser()
-
- parser.addInstanceDirArg()
- parser.addArg(alias="instancePath", shortFlag="i", longFlag="instance",
- help="instance file, has to be in DIMACS format", type=str)
-
- parser.addArg(alias="resultDir", shortFlag="o", longFlag="wmis_result_dir",
- help="the wmis result directory", type=str,
- ignoreDatabaseConfig=False)
-
- parser.addArg(alias="run", shortFlag="r", longFlag="run",
- help="results will get saved unter [instance]_[run].out", type=int)
-
- arguments = parser.parse()
-
- arguments["instanceFileName"] = os.path.basename(arguments["instancePath"])
-
- return arguments
-
-
-
- def __runWMISquboOnSatInstance(satInstance):
- print("generating wmis qubo...")
- qubo = SAT2QUBO.WMISdictQUBO(satInstance)
-
- print()
- print("running gbsolv...")
- qbresult = QBSolv().sample_qubo(Q=qubo, find_max=True)
-
- print()
- print("packing results...")
- results = __packResults(satInstance, qbresult)
-
- return results
-
- def __packResults(satInstance, qbresult):
- results = []
-
- samples = list(qbresult.samples())
- occurrences = qbresult.data_vectors["num_occurrences"]
-
- for i in tqdm(range(len(samples))):
- quboResult = __satQuboResultFromSample(samples[i])
- quboResult.setOccurrences(occurrences[i])
- quboResult.setSatisfiesInstance(satInstance)
-
- results.append(quboResult)
-
- return results
-
-
- def __writeResult(results, resultPath):
- resultDir = os.path.dirname(resultPath)
-
- if not os.path.exists(resultDir):
- os.makedirs(resultDir)
-
- resultFile = open(resultPath, "w+")
-
- for result in tqdm(results):
-
- resultFile.write(json.dumps(result.toPrimitive()))
- resultFile.write("\n\n")
-
- resultFile.close()
-
- def __satQuboResultFromSample(sample):
- result = SATquboResult()
-
- for binding in sample:
- isActive = True if sample[binding] == 1 else False
-
- result.addBinding(binding, isActive)
- #if sample[binding] == 1:
- #result.addActiveBinding(binding)
-
- return result
-
-
- if __name__ == "__main__":
- main()
|