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.
 
 
 
 

115 lines
3.1 KiB

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