import json from .kSAT import kSAT class SATquboResult: def __init__(self): self.__assignments = set() self.__activeBindings = {} self.__hasConflicts = False self.__occurrences = 1 self.__satisfiesInstance = False self.__assignmentsUpToDate = True def satisfiesInstance(self): return self.__satisfiesInstance def setSatisfiesInstance(self, satInstance): evaluation = satInstance.checkAssignment(self.getAssignmentsWithoutPositionIndex()) self.__satisfiesInstance = evaluation def addBinding(self, binding, isActive): self.__assignmentsUpToDate = False clause = binding[0] assignment = binding[1] varLabel = abs(assignment) if varLabel not in self.__activeBindings: self.__activeBindings[varLabel] = [] if not isActive: return bindingSign = -1 if assignment < 0 else 1 self.__activeBindings[varLabel].append((clause, bindingSign)) self.__checkForConflictAtVar(varLabel) def __checkForConflictAtVar(self, varLabel): if varLabel not in self.__activeBindings: return sign = None for assignment in self.__activeBindings[varLabel]: if sign != None: if sign * assignment[1] < 0: self.__hasConflicts = True return sign = assignment[1] def getAssignments(self): if not self.__assignmentsUpToDate: self.__updateAssignments() return self.__assignments def __updateAssignments(self): self.__assignments = set() for varLabel in self.__activeBindings: bindings = self.__activeBindings[varLabel] if not bindings: self.__assignments.add(-1 * varLabel) for binding in bindings: sign = binding[1] self.__assignments.add(sign * varLabel) self.__assignmentsUpToDate = True def getAssignmentsSortedByVarIndex(self): return sorted(self.getAssignments(), key=abs) def getAssignmentsWithoutPositionIndex(self): assignments = self.getAssignmentsSortedByVarIndex() for i in range(len(assignments)): assignments[i] = 0 if assignments[i] < 0 else 1 return assignments def getActiveBindings(self): return self.__activeBindings def hasConflicts(self): return self.__hasConflicts def setOccurrences(self, occurrences): self.__occurrences = occurrences def getOccurrences(self): return self.__occurrences def toPrimitive(self): primitive = {} primitive["assignments"] = self.getAssignmentsSortedByVarIndex() primitive["hasConflicts"] = self.__hasConflicts primitive["activeBindings"] = self.getActiveBindings() primitive["satisfiesInstance"] = self.__satisfiesInstance return primitive def fromPrimitive(self, primitive): for varLabel in primitive["activeBindings"]: bindings = primitive["activeBindings"][varLabel] if not bindings: self.addBinding((-1, int(varLabel)), False) for binding in bindings: clause = binding[0] sign = binding[1] self.addBinding((clause, sign * int(varLabel)), True) self.__satisfiesInstance = primitive["satisfiesInstance"] def readAssignmentsFromFile(resultFilePath): resultFile = open(resultFilePath, "r") assignments = [] line = resultFile.readline() while line: if line.strip(): assignments.append(__parseAssignmentFromLine(line)) line = resultFile.readline() resultFile.close() return assignments def __parseAssignmentFromLine(line): result = json.loads(line) assignment = [None] * abs(max(result["assignments"], key=abs)) for varAssignment in result["assignments"]: assignment[abs(varAssignment) - 1] = 0 if varAssignment < 0 else 1 return assignment def readResultsFromFile(resultFilePath): resultFile = open(resultFilePath, "r") results = [] line = resultFile.readline() while line: if line.strip(): result = SATquboResult() result.fromPrimitive(json.loads(line)) results.append(result) line = resultFile.readline() return results