def optimize(self): # assert self.model # Solve self.model.optimize() n = len(self.getX()) x = np.zeros((n, 1)) if self.model.status == GRB.status.OPTIMAL: for i in xrange(n): x[i][0] = self.getX()[i].x # f(x) + 1/2 * rho * ||x - K||2 f_opt = self.model.ObjVal prox = x - self.K prox = dnrm2(prox) prox *= self.rho prox *= 0.5 # f(x) f_opt -= prox return (x, f_opt)
def optimizeX(self): # assert self.model # Solve self.model_x.optimize() x = np.zeros((self.n, 1)) if self.model_x.status == GRB.status.OPTIMAL: for i in xrange(self.n): x[i][0] = self.getX()[i].x # f(x) + 1/2 * rho * ||A * x + B * zk - c + uk||2 f_opt = self.model_x.ObjVal prox = self.prox_x # B * zk - c + uk if(self.A is not None): prox += np.dot(self.A, x) prox = dnrm2(prox) # ||A * x + B * zk - c + uk||2 prox *= self.rho prox *= 0.5 # f(x) f_opt -= prox return (x, f_opt)
def _unitvec_l2(self, vec): return dscal(1.0 / dnrm2(vec), vec)
#### ## ## ADMM convergence criteria ## ## x ∈ Rn and z ∈ Rm, where A ∈ Rp×n, B ∈ Rp×m, and c ∈ Rp ## ## For exchange A = 1 and B = -1 ## ## e_pri = sqrt(p)+ e_abs + e_rel * max{Axk2,Bzk2,c2}, ## e_dual = sqrt(n) + e_abs + e_rel * A.T x yk2 ## ## This time n = p = T ####### # rk+1 = Axk+1 + Bzk+1 − c r_norm = np.sqrt(N) * dnrm2(x_mean)# r_i = x_mean => sqrt(sum ||r_i||_2^2) = sqrt(N * ||x_mean||_2^2) # |ρ * A.TxB * (zk+1 − zk)|2 s_norm = rho * nzdiffstack # |ρ * -1 * (zk+1 − zk)|2 = ρ * |zk+1 − zk|2 # as described above eps_pri = np.sqrt(T) * ABSTOL + RELTOL * max(nxstack, nzstack) eps_dual = np.sqrt(T) * ABSTOL + RELTOL * nystack # current snapshot if(rank == 0 and DISP): print ("\n%3d\t%10.3f\t%10.3f\t%10.3f\t%10.3f\t%10.3f\t%10.3f" % (k, rho, r_norm, eps_pri, s_norm, eps_dual,cost)) # save history if (rank == 0):