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.
 
 
 
 

105 lines
3.4 KiB

#!/usr/bin/env python3
import numpy as np
import kSAT
from tqdm import tqdm
import math
__VERTEX_WEIGHT__ = 1
__EDGE_WEIGHT__ = -2
def WMISdictQUBO(kSATInstance):
quboInstance = {}
for clauseIndex in tqdm(range(kSATInstance.getNumberOfClauses())):
clause = kSATInstance.getClause(clauseIndex)
# build triangles
for varIndexInClause in range(len(clause)):
label = kSATInstance.getLableOfBinding(clauseIndex,
clause[varIndexInClause])
quboInstance[(label, label)] = __VERTEX_WEIGHT__
for i in range(varIndexInClause + 1, len(clause)):
targetLabel = kSATInstance.getLableOfBinding(clauseIndex,
clause[i])
quboInstance[(label, targetLabel)] = __EDGE_WEIGHT__
# connect conflicts
for conflict in kSATInstance.getConflicts():
quboInstance[(conflict[0], conflict[1])] = __EDGE_WEIGHT__
return quboInstance
class QuboWriter:
def __init__(self, qubo):
self.__labelIndexDict = {}
self.__qubo = qubo
self.__initLabelIndexDict(self.__qubo)
print(self.__labelIndexDict)
def __initLabelIndexDict(self, qubo):
indexCount = 0
for coupler in qubo:
label1 = coupler[0]
label2 = coupler[1]
if label1 not in self.__labelIndexDict:
self.__labelIndexDict[label1] = indexCount
indexCount += 1
if label2 not in self.__labelIndexDict:
self.__labelIndexDict[label2] = indexCount
indexCount += 1
def write(self, filePath):
quboFile = open(filePath, "w")
self.__writeQuboFileHeader(quboFile)
self.__writeQuboFileNodes(quboFile)
self.__writeQuboFileCouplers(quboFile)
quboFile.close()
def __writeQuboFileHeader(self, quboFile):
numberOfNodes = len(self.__labelIndexDict)
numberOfCouplers = len(self.__qubo) - numberOfNodes
quboFile.write("c\n")
quboFile.write("c this is a generated qubo file\n")
quboFile.write("c\n")
quboFile.write("p qubo 0 %d %d %d\n" %(numberOfNodes,
numberOfNodes,
numberOfCouplers))
def __writeQuboFileNodes(self, quboFile):
for label in self.__labelIndexDict:
self.__writeCoupler(quboFile, (label, label))
def __writeCoupler(self, quboFile, coupler):
indices = self.__getNodeIndicesFromCoupler(coupler)
quboFile.write("%d %d %d\n" % (indices[0],
indices[1],
self.__qubo[coupler]))
def __getNodeIndicesFromCoupler(self, coupler):
index1 = self.__labelIndexDict[coupler[0]]
index2 = self.__labelIndexDict[coupler[1]]
if index1 <= index2:
return [index1, index2]
else:
return [index2, index1]
def __writeQuboFileCouplers(self, quboFile):
for coupler in self.__qubo:
if coupler[0] != coupler[1]:
self.__writeCoupler(quboFile, coupler)