def addGroupCardConstraints(self): self.upperGCard = self.element.gcard.interval[1].value self.lowerGCard = self.element.gcard.interval[0].value if (len(self.fields) == 0 and ((not self.superSort) or self.superSort.fields == 0)): return #lower bounds if not self.fields: return # front end is broken if self.lowerGCard == 0 and self.upperGCard == -1: return for i in range(self.numInstances): bigSumm = SMTLib.SMT_IntConst(0) for j in self.fields: bigSumm = SMTLib.SMT_Plus(bigSumm, j.summs[i]) #**** LEAVE THIS CODE **** #don't include inherited fields for now #if self.superSort: # for j in self.superSort.fields: # print("found " + str(j)) # bigSumm = bigSumm + j.summs[i + self.indexInSuper] if self.lowerGCard != 0: self.constraints.addGroupCardConstraint( SMTLib.SMT_Implies( self.isOn(i), SMTLib.SMT_GE(bigSumm, SMTLib.SMT_IntConst(self.lowerGCard)))) if self.upperGCard != -1: self.constraints.addGroupCardConstraint( SMTLib.SMT_Implies( self.isOn(i), SMTLib.SMT_LE(bigSumm, SMTLib.SMT_IntConst(self.upperGCard))))
def op_add(left, right): ''' :param left: :type left: :class:`~IntArg` :param right: :type right: :class:`~IntArg` :returns: :class:`~IntArg` Returns left + right. ''' assert isinstance(left, ExprArg) assert isinstance(right, ExprArg) lval = left.getInts() lval = [SMTLib.createIf(c, e, SMTLib.SMT_IntConst(0)) for (e, c) in lval] lval = SMTLib.createSum(lval) rval = right.getInts() rval = [SMTLib.createIf(c, e, SMTLib.SMT_IntConst(0)) for (e, c) in rval] rval = SMTLib.createSum(rval) return IntArg(SMTLib.SMT_Plus(lval, rval))