コード例 #1
0
ファイル: ClaferSort.py プロジェクト: srenatus/ClaferSMT
    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))))
コード例 #2
0
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))