def solve_full(self, bi, lmbd, show_progress=True): solvers.options['show_progress'] = show_progress # load problem data self.bi = bi self.lmbd = lmbd self.c[1 + self.Nm:1 + self.Nm + self.Nb] = lmbd self.h[1:1 + self.Nm] = -bi t1 = time() self.sol = solvers.conelp(self.c, self.G, self.h, self.dims, self.A, self.b) t2 = time() t3 = time() if self.sol['status'] in ('optimal'): S = self.sol['s'][1 + self.Nm:] self.sA[:] = S[self.I11] + 1j * S[self.I21] lapack.heevr(self.sA, self.sW, jobz='V', range='I', uplo='L', vl=0.0, vu=0.0, il=self.Nb, iu=self.Nb, Z=self.sZ) self.beta_hat[:] = math.sqrt(self.sW[0]) * self.sZ[:, 0] else: raise RuntimeError('numerical problems') t4 = time() self.solver_time = t2 - t1 self.eig_time = t4 - t3
def solve_full(self, bi, lmbd, show_progress=True): solvers.options['show_progress'] = show_progress # load problem data self.bi = bi self.lmbd = lmbd self.c[1 + self.Nm:1 + self.Nm + self.Nb] = lmbd self.h[1:1 + self.Nm] = -bi t1 = time() self.sol = solvers.conelp( self.c, self.G, self.h, self.dims, self.A, self.b) t2 = time() t3 = time() if self.sol['status'] in ('optimal'): S = self.sol['s'][1 + self.Nm:] self.sA[:] = S[self.I11] + 1j*S[self.I21] lapack.heevr( self.sA, self.sW, jobz='V', range='I', uplo='L', vl=0.0, vu=0.0, il=self.Nb, iu=self.Nb, Z=self.sZ) self.beta_hat[:] = math.sqrt(self.sW[0])*self.sZ[:, 0] else: raise RuntimeError('numerical problems') t4 = time() self.solver_time = t2 - t1 self.eig_time = t4 - t3
def solve_linmap(self, bi, lmbd, linmap, show_progress=True): solvers.options['show_progress'] = show_progress # save all problem data self.bi, self.lmbd = bi, lmbd # count alive in map Nm2 = int(sum(linmap)) self.Nm2 = Nm2 self.linmap = linmap n_x1 = self.Nb * (self.Nb + 1) // 2 n_x2 = self.Nb * (self.Nb - 1) // 2 n_x = 1 + Nm2 + n_x1 + n_x2 c = matrix(0.0, (1 + Nm2 + n_x1 + n_x2, 1)) c[0] = 1.0 c[1 + Nm2:1 + Nm2 + self.Nb] = lmbd G = matrix(0.0, (1 + Nm2 + (2 * self.Nb)**2, n_x)) G[:1 + Nm2, :1 + Nm2] = -eye(1 + Nm2) G[1 + Nm2:, 1 + Nm2:] = self.G[1 + self.Nm:, 1 + self.Nm:] h = matrix(0.0, (1 + Nm2 + (2 * self.Nb)**2, 1)) A = matrix(0.0, (Nm2, n_x)) lbi = matrix(0.0, (Nm2, 1)) A[:, 1:1 + Nm2] = eye(Nm2) pos = 0 for i in range(self.Nm): if linmap[i] != 0.0: A[pos, 1 + Nm2:] = self.A[i, 1 + self.Nm:] lbi[pos] = bi[i] h[1 + pos] = -bi[i] pos += 1 assert (pos == Nm2) b = matrix(0.0, (Nm2, 1)) dims = {'l': 0, 'q': [1 + Nm2], 's': [2 * self.Nb]} t1 = time() self.sol = solvers.conelp(c, G, h, dims, A, b) t2 = time() self.lc = c self.lG = G self.lh = h self.ldims = dims self.lA = A self.lb = b self.lNm = Nm2 self.lbi = lbi t3 = time() if self.sol['status'] in ('optimal', 'unknown'): S = self.sol['s'][1 + Nm2:] self.sA[:] = S[self.I11] + 1j * S[self.I21] lapack.heevr(self.sA, self.sW, jobz='V', range='I', uplo='L', vl=0.0, vu=0.0, il=self.Nb, iu=self.Nb, Z=self.sZ) self.beta_hat[:] = math.sqrt(self.sW[0]) * self.sZ[:, 0] else: raise RuntimeError('numerical problems') t4 = time() self.solver_time = t2 - t1 self.eig_time = t4 - t3
def solve_linmap(self, bi, lmbd, linmap, show_progress=True): solvers.options['show_progress'] = show_progress # save all problem data self.bi, self.lmbd = bi, lmbd # count alive in map Nm2 = int(sum(linmap)) self.Nm2 = Nm2 self.linmap = linmap n_x1 = self.Nb*(self.Nb + 1)//2 n_x2 = self.Nb*(self.Nb - 1)//2 n_x = 1 + Nm2 + n_x1 + n_x2 c = matrix(0.0, (1 + Nm2 + n_x1 + n_x2, 1)) c[0] = 1.0 c[1 + Nm2:1 + Nm2 + self.Nb] = lmbd G = matrix(0.0, (1 + Nm2 + (2*self.Nb)**2, n_x)) G[:1 + Nm2, :1 + Nm2] = -eye(1 + Nm2) G[1 + Nm2:, 1 + Nm2:] = self.G[1 + self.Nm:, 1 + self.Nm:] h = matrix(0.0, (1 + Nm2 + (2*self.Nb)**2, 1)) A = matrix(0.0, (Nm2, n_x)) lbi = matrix(0.0, (Nm2, 1)) A[:, 1:1 + Nm2] = eye(Nm2) pos = 0 for i in range(self.Nm): if linmap[i] != 0.0: A[pos, 1 + Nm2:] = self.A[i, 1 + self.Nm:] lbi[pos] = bi[i] h[1 + pos] = -bi[i] pos += 1 assert(pos == Nm2) b = matrix(0.0, (Nm2, 1)) dims = {'l': 0, 'q': [1 + Nm2], 's': [2*self.Nb]} t1 = time() self.sol = solvers.conelp(c, G, h, dims, A, b) t2 = time() self.lc = c self.lG = G self.lh = h self.ldims = dims self.lA = A self.lb = b self.lNm = Nm2 self.lbi = lbi t3 = time() if self.sol['status'] in ('optimal', 'unknown'): S = self.sol['s'][1 + Nm2:] self.sA[:] = S[self.I11] + 1j*S[self.I21] lapack.heevr( self.sA, self.sW, jobz='V', range='I', uplo='L', vl=0.0, vu=0.0, il=self.Nb, iu=self.Nb, Z=self.sZ) self.beta_hat[:] = math.sqrt(self.sW[0])*self.sZ[:, 0] else: raise RuntimeError('numerical problems') t4 = time() self.solver_time = t2 - t1 self.eig_time = t4 - t3
def solve(self, solver = "mosek"): if self.to_real == False: raise ValueError("Solvers do not support complex-valued data.") sol = {} c,G,h,dims = self.problem_data if solver == "mosek": if self.__verbose: msk.options[msk.mosek.iparam.log] = 1 else: msk.options[msk.mosek.iparam.log] = 0 solsta,mu,zz = msk.conelp(c,G,matrix(h),dims) sol['status'] = str(solsta).split('.')[-1] elif solver == "cvxopt": if self.__verbose: options = {'show_progress':True} else: options = {'show_progress':False} csol = solvers.conelp(c,G,matrix(h),dims,options=options) zz = csol['z'] mu = csol['x'] sol['status'] = csol['status'] else: raise ValueError("Unknown solver %s" % (solver)) if zz is None: return sol sol['mu'] = mu offset = self.offset sol['t'] = zz[:offset['wpl']] sol['wpl'] = zz[offset['wpl']:offset['wpu']] sol['wpu'] = zz[offset['wpu']:offset['wql']] sol['wql'] = zz[offset['wql']:offset['wqu']] sol['wqu'] = zz[offset['wqu']:offset['ul']] sol['ul'] = zz[offset['ul']:offset['uu']] sol['uu'] = zz[offset['uu']:offset['z']] sol['z'] = zz[offset['z']:offset['w']] sol['w'] = zz[offset['w']:offset['X']] if self.conversion: dims = self.problem_data[3] offset = dims['l'] + sum(dims['q']) self.Xc = [] sol['eigratio'] = [] for k,sk in enumerate(dims['s']): zk = matrix(zz[offset:offset+sk**2],(sk,sk)) offset += sk**2 zkr = 0.5*(zk[:sk//2,:sk//2] + zk[sk//2:,sk//2:]) zki = 0.5*(zk[sk//2:,:sk//2] - zk[:sk//2,sk//2:]) zki[::sk+1] = 0.0 zk = zkr + complex(0,1.0)*zki self.Xc.append(zk) ev = matrix(0.0,(zk.size[0],1),tc='d') lapack.heev(+zk,ev) ev = sorted(list(ev),reverse=True) sol['eigratio'].append(ev[0]/ev[1]) # Build partial Hermitian matrix z = matrix([zk[:] for zk in self.Xc]) blki,I,J,bn = self.blocks_to_sparse[0] X = spmatrix(z[blki],I,J) idx = [i for i,ij in enumerate(zip(X.I,X.J)) if ij[0] > ij[1]] sol['X'] = chompack.tril(X) + spmatrix(X.V[idx].H, X.J[idx], X.I[idx], X.size) else: X = matrix(zz[offset['X']:],(2*self.nbus,2*self.nbus)) Xr = X[:self.nbus,:self.nbus] Xi = X[self.nbus:,:self.nbus] Xi[::self.nbus+1] = 0.0 X = Xr + complex(0.0,1.0)*Xi sol['X'] = +X V = matrix(0.0,(self.nbus,5),tc='z') w = matrix(0.0,(self.nbus,1)) lapack.heevr(X, w, Z = V, jobz='V', range='I', il = self.nbus-4, iu = self.nbus) sol['eigratio'] = [w[4]/w[3]] if w[4]/w[3] < self.eigtol and self.__verbose: print("Eigenvalue ratio smaller than %e."%(self.eigtol)) sol['eigs'] = w[:5] V = V[:,-1]*sqrt(w[4]) sol['V'] = V # Branch injections sol['Sf'] = self.baseMVA*(sol['z'][1::6] + complex(0.0,1.0)*sol['z'][2::6]) sol['St'] = self.baseMVA*(sol['z'][4::6] + complex(0.0,1.0)*sol['z'][5::6]) # Generation sol['Sg'] = (matrix([gen['Pmin'] for gen in self.generators]) +\ matrix([0.0 if gen['pslack'] is None else sol['wpl'][gen['pslack']] for gen in self.generators])) +\ complex(0.0,1.0)*(matrix([gen['Qmin'] for gen in self.generators]) +\ matrix([0.0 if gen['qslack'] is None else sol['wql'][gen['qslack']] for gen in self.generators])) Pg = sol['Sg'].real() Qg = sol['Sg'].imag() for k,gen in enumerate(self.generators): gen['Pg'] = Pg[k] gen['Qg'] = Qg[k] sol['Sg'] *= self.baseMVA sol['cost'] = 0.0 for ii,gen in enumerate(self.generators): for nk in range(gen['Pcost']['ncoef']): sol['cost'] += gen['Pcost']['coef'][-1-nk]*(Pg[ii]*self.baseMVA)**nk sol['cost_objective'] = -(self.problem_data[0].T*mu)[0]*self.cost_scale + self.const_cost sol['Vm'] = sqrt(matrix(sol['X'][::self.nbus+1]).real()) return sol