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
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.")