Esempio n. 1
0
    def make_constraints(self, budget):
        constraints = []
        T = self.T
        ram_costs = self.g.cost_ram
        ram_cost_vec = np.asarray([ram_costs[i] for i in range(T)])

        with Timer("Var bounds"):
            constraints.extend([self.R >= 0, self.R <= 1])
            constraints.extend([self.Sram >= 0, self.Sram <= 1])
            constraints.extend([self.Ssd >= 0, self.Ssd <= 1])
            constraints.extend([self.Min >= 0, self.Min <= 1])
            constraints.extend([self.Mout >= 0, self.Mout <= 1])
            constraints.extend([self.Free_E >= 0, self.Free_E <= 1])
            constraints.extend([self.U >= 0, self.U <= budget])
            constraints.append(cp.diag(self.R) == 1)
            constraints.append(cp.upper_tri(self.R) == 0)
            constraints.append(cp.diag(self.Sram) == 0)
            constraints.append(cp.upper_tri(self.Sram) == 0)
            constraints.append(cp.diag(self.Ssd) == 0)
            constraints.append(cp.upper_tri(self.Ssd) == 0)
            constraints.append(cp.upper_tri(self.Min) == 0)
            constraints.append(cp.upper_tri(self.Mout) == 0)

        with Timer("Correctness constraints"):
            # ensure all computations are possible
            for (u, v) in self.g.edge_list:
                constraints.append(self.R[:, v] <= self.R[:, u] + self.Sram[:, u])

            # ensure all checkpoints are in memory
            constraints.append(self.Sram[1:, :] <= self.R[:-1, :] + self.Sram[:-1, :] + self.Min[:-1, :])
            constraints.append(self.Ssd[1:, :] <= self.Ssd[:-1, :] + self.Mout[:-1, :])
            constraints.append(self.Min <= self.Ssd)
            constraints.append(self.Mout <= self.Sram)

        with Timer("Free_E constraints"):
            # Constraint: sum_k Free_{t,i,k} <= 1
            for i in range(T):
                frees = [self.Free_E[:, eidx] for eidx, (j, _) in enumerate(self.g.edge_list) if i == j]
                if frees:
                    constraints.append(cp.sum(frees, axis=0) <= 1)

            # Constraint: Free_{t,i,k} <= 1 - S_{t+1, i}
            for eidx, (i, k) in enumerate(self.g.edge_list):
                constraints.append(self.Free_E[:-1, eidx] + self.Sram[1:, i] <= 1)

            # Constraint: Free_{t,i,k} <= 1 - R_{t, j}
            for eidx, (i, k) in enumerate(self.g.edge_list):
                for j in self.g.successors(i):
                    if j > k:
                        constraints.append(self.Free_E[:, eidx] + self.R[:, j] <= 1)

        with Timer("U constraints"):
            constraints.append(self.U[:, 0] == self.R[:, 0] * ram_costs[0] + ram_cost_vec @ self.Sram.T)
            for k in range(T - 1):
                mem_freed = cp.sum([ram_costs[i] * self.Free_E[:, eidx] for (eidx, i) in self.g.predecessors_indexed(k)])
                constraints.append(self.U[:, k + 1] == self.U[:, k] + self.R[:, k + 1] * ram_costs[k + 1] - mem_freed)
        return constraints
Esempio n. 2
0
 def test_upper_tri(self):
     with self.assertRaises(Exception) as cm:
         cp.upper_tri(self.C)
     self.assertEqual(str(cm.exception),
                      "Argument to upper_tri must be a square matrix.")