コード例 #1
0
 def isValid(self):
     """Check if this building block class induces valid inequalities."""
     # qRange = np.arange(1, self.q)
     # for loVals in itertools.product((0,1), repeat=self.q-1):
     #     maskModQ = np.dot(qRange, loVals) % self.q
     #     if maskModQ != 0:
     #         rhs = -np.dot(loVals, self.vals[self.lo, 1:])
     #         lhs = self.vals[0, self.q - maskModQ]
     #         if lhs > rhs:
     #             #print(mask, maskModQ, lhs, rhs)
     #             return False
     # return True
     import gurobimh as g
     model = g.Model()
     model.setParam('OutputFlag', 0)
     zVars = [
         model.addVar(vtype=g.GRB.INTEGER,
                      ub=self.vals[0, self.sigma],
                      name='y{}'.format(i)) for i in range(1, self.p)
     ]
     xVars = [
         model.addVar(vtype=g.GRB.BINARY, name='x{}'.format(i))
         for i in range(1, self.p)
     ]
     modQVar = model.addVar(vtype=g.GRB.INTEGER,
                            lb=-g.GRB.INFINITY,
                            ub=g.GRB.INFINITY,
                            name='z')
     model.update()
     model.addConstr(
         g.LinExpr(self.vals[self.sigma, 1:], zVars) +
         g.LinExpr(self.vals[0, 1:], xVars) >= 1)
     model.addConstr(g.quicksum(xVars) == 1)
     qRange = list(range(1, self.p))
     model.addConstr(
         g.LinExpr(qRange, zVars) + g.LinExpr(qRange, xVars) +
         self.p * modQVar == 0)
     model.optimize()
     if model.Status == g.GRB.INFEASIBLE:
         return True
     else:
         # print('invalid y/x:')
         # print([x.X for x in xVars])
         # print([y.X for y in zVars])
         return False
コード例 #2
0
ファイル: staticlp.py プロジェクト: zqcawzs/lpdec
 def __init__(self, code, gurobiParams=None, gurobiVersion=None, ml=False, name=None):
     if name is None:
         name = 'Explicit{}Decoder'.format('ML' if ml else 'LP')
     self.ml = ml
     GurobiDecoder.__init__(self, code, name, gurobiParams, gurobiVersion, integer=ml)
     self.timer = utils.Timer()
     assert code.q == 2, 'only binary codes are supported'
     from lpdec.polytopes import feldmanInequalities
     A, b = feldmanInequalities(code.parityCheckMatrix)
     for i in range(len(b)):
         self.model.addConstr(gu.LinExpr(A[i], self.xlist), gu.GRB.LESS_EQUAL, b[i])
     self.model.update()
コード例 #3
0
 def test_add_empty_expression(self):
     num_vars = 100
     m = grb.Model()
     m.setParam('OutputFlag', 0)
     x = [m.addVar() for i in range(num_vars)]
     m.update()
     expr = grb.quicksum(x)
     self.assertEquals((expr + grb.LinExpr()).size(), num_vars)
     self.assertEquals((expr - grb.LinExpr()).size(), num_vars)
     expr += grb.LinExpr()
     self.assertEquals(expr.size(), num_vars)
     expr -= grb.LinExpr()
     self.assertEquals(expr.size(), num_vars)
     expr += grb.LinExpr(100)
     self.assertEquals(expr.getConstant(), 100)
     expr -= grb.LinExpr(10)
     self.assertEquals(expr.getConstant(), 90)
コード例 #4
0
    def isDominatedBy(self, others):
        """Strong dominance check using linear programming"""
        if len(others) == 0:
            return False
        import gurobimh as g
        model = g.Model()
        model.setParam('OutputFlag', 0)
        vars = [
            model.addVar(lb=0) for _ in range(3 * len(others) * (self.p - 1))
        ]
        model.update()
        Ahi = np.empty((self.p - 1, len(others) * (self.p - 1)))
        Alo = np.empty((self.p - 1, len(others) * (self.p - 1)))

        for i, cls in enumerate(others):
            for automorphism in range(1, self.p):
                for j in range(1, self.p):
                    Ahi[j - 1, i * (self.p - 1) + automorphism -
                        1] = cls.vals[0, automorphism * j % self.p]
                    Alo[j - 1, i * (self.p - 1) + automorphism -
                        1] = cls.vals[cls.sigma, automorphism * j % self.p]

        # b = np.hstack((self.vals[0, 1:], self.vals[self.lo, 1:], self.vals[self.lo, 1:]))
        # A = np.array(np.bmat([[Ahi, Alo, Alo], [Alo, Ahi, Alo], [Alo, Alo, Ahi]]))
        # test simpler
        b = np.hstack((self.vals[0, 1:], self.vals[self.sigma, 1:]))
        A = np.vstack((Ahi, Alo))
        # print('A=',A)
        # print('b=',b)
        for i, row in enumerate(A):
            model.addConstr(g.LinExpr(row, vars) >= b[i])
        model.update()
        model.optimize()
        # if model.status != g.GRB.INFEASIBLE:
        #     print('others', [o.m for o in others])
        #     print('solution', [v.X for v in vars])
        return model.Status != g.GRB.INFEASIBLE