Exemplo n.º 1
0
    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
Exemplo n.º 2
0
    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
Exemplo n.º 3
0
    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
Exemplo n.º 4
0
    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
Exemplo n.º 5
0
    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