Source code for optalg.opt_solver.problem_quad

#****************************************************#
# This file is part of OPTALG.                       #
#                                                    #
# Copyright (c) 2015-2017, Tomas Tinoco De Rubira.   #
#                                                    #
# OPTALG is released under the BSD 2-clause license. #
#****************************************************#

import numpy as np
from .problem import OptProblem
from scipy.sparse import tril,triu,coo_matrix

[docs]class QuadProblem(OptProblem): """ Quadratic problem class. It represents problem of the form minimize (1/2)x^THx + g^Tx subject to Ax = b l <= x <= u """ def __init__(self,H,g,A,b,l,u,x=None,lam=None,mu=None,pi=None,problem=None): """ Quadratic program class. Parameters ---------- H : symmetric matrix g : vector A : matrix l : vector u : vector x : vector problem : OptProblem """ OptProblem.__init__(self) if problem is not None: problem.eval(problem.x) H = problem.Hphi + problem.Hphi.T - triu(problem.Hphi) g = problem.gphi - H*problem.x A = problem.A b = problem.b l = problem.l u = problem.u self.H = coo_matrix(H) self.Hphi = tril(self.H) # lower triangular self.g = g self.A = coo_matrix(A) self.b = b self.u = u self.l = l self.f = np.zeros(0) self.J = coo_matrix((0,H.shape[0])) self.H_combined = coo_matrix(H.shape) self.x = x self.lam = lam self.mu = mu self.pi = pi # Check data assert(H.shape[0] == H.shape[1]) assert(H.shape[0] == A.shape[1]) assert(b.size == A.shape[0]) assert(u.size == l.size) if x is not None: assert(x.size == H.shape[0]) assert(x.size == A.shape[1]) assert(x.size == l.size) if lam is not None: assert(lam.size == A.shape[0]) if mu is not None: assert(mu.size == u.size) if pi is not None: assert(pi.size == u.size) def eval(self,x): self.phi = 0.5*np.dot(x,self.H*x) + np.dot(self.g,x) self.gphi = self.H*x + self.g def show(self): print('\nQP Problem') print('----------') print('H shape : (%d,%d)' %(self.H.shape[0],self.H.shape[1])) print('H nnz : %.2f %%' %(100.*self.H.nnz/(self.H.shape[0]*self.H.shape[1]))) print('A shape : (%d,%d)' %(self.A.shape[0],self.A.shape[1])) print('A nnz : %.2f %%' %(100.*self.A.nnz/(self.A.shape[0]*self.A.shape[1])))