示例#1
0
def loglikelyhood_cvxopt(xxf,extra_args,to_CVXOPT=False):
    if not to_CVXOPT:    
        return mw.fitter_s.loglikelyhood(np.array(xxf).flatten(),*extra_args)
    case,sin,sout,selfs,M,nvarx,nvary,inds_selfs = extra_args[:8]
    x = xxf[:nvarx]
    y = xxf[nvarx:]
    xl = cvxopt.log(x)
    yl = cvxopt.log(y)
    if case == 'W':
        aux = 1.-np.einsum('ik,jk',x,y)
    elif case == 'B':
        aux = 1./(1.+np.einsum('ik,jk',x,y))
    else:
        aux = np.einsum('ik,jk',x,y)
    if not selfs:
        aa = aux.flatten()
        if case == 'ME':
            aa[inds_selfs] = 0.
        else:
            aa[inds_selfs] = 1.
        aux = aa.reshape(nvarx,nvary)
    L1 = np.einsum('ik,ik',sin,yl)
    L2 = np.einsum('ik,ik',sout,xl)
    if case == 'ME':
        L4 = np.einsum('ij->',-aux)
    else:
        L4 = np.einsum('ij->',np.log(aux))
    L = -(M*L4+L1+L2)
    return -(M*L4+L1+L2)
示例#2
0
文件: maxent.py 项目: cvxopt/cvxopt
def F(x=None, z=None):
   if x is None: return 0, matrix(1.0, (n,1))
   if min(x) <= 0: return None
   f = x.T*log(x)
   grad = 1.0 + log(x)
   if z is None: return f, grad.T
   H = spdiag(z[0] * x**-1)
   return f, grad.T, H 
示例#3
0
def F(x=None, z=None):
    if x is None: return 0, matrix(1.0 / p, (p, 1))
    if min(x) < 0: return None
    f = x.T * log(x) - x.T * logv
    Df = (log(x) + 1 - logv).T
    if z is None: return f, Df
    H = spmatrix(div(1, x), range(p), range(p))
    return f, Df, H
示例#4
0
def F(x=None, z=None):
    if x is None: return 0, matrix(1.0, (n, 1))
    if min(x) <= 0: return None
    f = x.T * log(x)
    grad = 1.0 + log(x)
    if z is None: return f, grad.T
    H = spdiag(z[0] * x**-1)
    return f, grad.T, H
示例#5
0
def I_X_YZ(p):
    # Mutual information I( X ; YZ )
    p_x = marginal_x(p)
    p_yz = marginal_yz(p)
    mysum = 0
    for xyz,t in p.items():
        x,y,z = xyz
        if t>0:  mysum += t * log( t / ( p_x[x]*p_yz[(y,z)] ) )
    return mysum/log(2)
示例#6
0
def I_X_YZ(p):
    # Mutual information I( X ; YZ )
    p_x = marginal_x(p)
    p_yz = marginal_yz(p)
    mysum = 0
    for xyz, t in p.items():
        x, y, z = xyz
        if t > 0: mysum += t * log(t / (p_x[x] * p_yz[(y, z)]))
    return mysum / log(2)
示例#7
0
 def solve(self, p, ZERO=1.e-1000):
     p_yz = marginal_yz_with_cutoff(p, ZERO)
     if self.first_time:
         self.first_time = False
         for x in self.cui.X:
             for y in self.cui.Y:
                 for z in self.cui.Z:
                     xyz = x, y, z
                     if xyz in p.keys() and p[xyz] > ZERO:
                         # equation
                         p_xyz = p[xyz]
                         rhs = -log(p_xyz / p_yz[y, z])  # >= 0
                         self.constr_geq[xyz].setAttr("rhs", rhs)
                         self.constr_leq[xyz].setAttr("rhs", rhs)
                     else:
                         # inequality
                         if xyz in self.constr_leq.keys():
                             self.model.remove(self.constr_leq[xyz])
                             del self.constr_leq[xyz]
                         if (y, z) in p_yz.keys() and p_yz[y, z] > 0:
                             rhs = 1.e400  # don't need ZERO here,  marginal_yz_w_cutoff()
                         else:
                             rhs = 0.
                         self.constr_geq[xyz].setAttr("rhs", rhs)
                     # if
                 #^ for z
             #^ for y
         #^ for x
     else:  # same, but different loop
         for xyz in p.keys():
             x, y, z = xyz
             if p[xyz] > ZERO:
                 # equation
                 p_xyz = p[xyz]
                 rhs = -log(p_xyz / p_yz[y, z])  # >= 0
                 self.constr_leq[xyz].setAttr("rhs", rhs)
                 self.constr_geq[xyz].setAttr("rhs", rhs)
             else:
                 # inequality
                 if xyz in self.constr_leq.keys():
                     self.model.remove(self.constr_leq[xyz])
                     del self.constr_leq[xyz]
                 if (y, z) in p_yz.keys() and p_yz[y, z] > 0:
                     rhs = 1.e400  # don't need ZERO here,  marginal_yz_w_cutoff()
                 else:
                     rhs = 0.
                 self.constr_geq[xyz].setAttr("rhs", rhs)
             # if
         #^ for xyz
     #^ if/else  first time
     self.model.update()
     self.model.optimize()
     if self.model.status == Compute_UI.KKT_System.gurobi.GRB.Status.OPTIMAL:
         t = self.t_var.getAttr("x")
         return t
     else:
         return None
示例#8
0
def I_X_Y(p):
    # Mutual information I( X ; Y )
    p_x  = marginal_x(p)
    p_y  = marginal_y(p)
    p_xy = marginal_xy(p)
    mysum = 0
    for xy,t in p_xy.items():
        x,y = xy
        if t>0:  mysum += t * log( t / ( p_x[x]*p_y[y] ) )
    return mysum/log(2)
示例#9
0
def I_X_Y(p):
    # Mutual information I( X ; Y )
    p_x = marginal_x(p)
    p_y = marginal_y(p)
    p_xy = marginal_xy(p)
    mysum = 0
    for xy, t in p_xy.items():
        x, y = xy
        if t > 0: mysum += t * log(t / (p_x[x] * p_y[y]))
    return mysum / log(2)
示例#10
0
def cond_I_X_Y__Z(p):
    # Conditional mutual information I( X ; Y | Z )
    p_z  = marginal_z(p)
    p_xz = marginal_xz(p)
    p_yz = marginal_yz(p)
    mysum = 0
    for xyz,t in p.items():
        x,y,z = xyz
        if t>0:  mysum += t * log( ( t * p_z[z] )/( p_xz[(x,z)]*p_yz[(y,z)] ) )
    return mysum/log(2)
示例#11
0
 def F(self, x=None, z=None):
     if (x is None):
         return 0, matrix(1., (len(self.validTours), 1))
     if (min(x) < 0.0):
         return None
     f = (x.T * log(x))
     Df = (1. + log(x)).T
     if (z is None):
         return f, Df
     H = spdiag(z * x**(-1))
     return f, Df, H
示例#12
0
def cond_I_X_Z__Y(p):
    # Conditional mutual information I( X ; Y | Z )
    p_y = marginal_y(p)
    p_xy = marginal_xy(p)
    p_yz = marginal_yz(p)
    mysum = 0
    for xyz, t in p.items():
        x, y, z = xyz
        if t > 0:
            mysum += t * log((t * p_y[y]) / (p_xy[(x, y)] * p_yz[(y, z)]))
    return mysum / log(2)
示例#13
0
def cond_I_X_Y__Z(p):
    # Conditional mutual information I( X ; Y | Z )
    p_z = marginal_z(p)
    p_xz = marginal_xz(p)
    p_yz = marginal_yz(p)
    mysum = 0
    for xyz, t in p.items():
        x, y, z = xyz
        if t > 0:
            mysum += t * log((t * p_z[z]) / (p_xz[(x, z)] * p_yz[(y, z)]))
    return mysum / log(2)
示例#14
0
 def solve(self, p, ZERO=1.e-1000):
     p_yz = marginal_yz_with_cutoff(p,ZERO)
     if self.first_time:
         self.first_time = False
         for x in self.cui.X:
             for y in self.cui.Y:
                 for z in self.cui.Z:
                     xyz=x,y,z
                     if xyz in p.keys() and p[xyz] > ZERO:
                         # equation
                         p_xyz = p[xyz]
                         rhs = -log(p_xyz/p_yz[y,z])  # >= 0
                         self.constr_geq[ xyz ].setAttr("rhs", rhs)
                         self.constr_leq[ xyz ].setAttr("rhs", rhs)
                     else:
                         # inequality
                         if xyz in self.constr_leq.keys():
                             self.model.remove(self.constr_leq[xyz])
                             del self.constr_leq[ xyz ]
                         if (y,z) in p_yz.keys() and p_yz[y,z] > 0:    rhs = 1.e400       # don't need ZERO here,  marginal_yz_w_cutoff()
                         else:                                         rhs = 0.
                         self.constr_geq[ xyz ].setAttr("rhs", rhs)
                     # if
                 #^ for z
             #^ for y
         #^ for x
     else: # same, but different loop
         for xyz in p.keys():
             x,y,z=xyz
             if p[xyz] > ZERO:
                 # equation
                 p_xyz = p[xyz]
                 rhs = -log(p_xyz/p_yz[y,z])  # >= 0
                 self.constr_leq[ xyz ].setAttr("rhs", rhs)
                 self.constr_geq[ xyz ].setAttr("rhs", rhs)
             else:
                 # inequality
                 if xyz in self.constr_leq.keys():
                     self.model.remove(self.constr_leq[xyz])
                     del self.constr_leq[ xyz ]
                 if (y,z) in p_yz.keys() and p_yz[y,z] > 0:    rhs = 1.e400       # don't need ZERO here,  marginal_yz_w_cutoff()
                 else:                                         rhs = 0.
                 self.constr_geq[ xyz ].setAttr("rhs", rhs)
             # if
         #^ for xyz
     #^ if/else  first time
     self.model.update()
     self.model.optimize();
     if self.model.status == Compute_UI.KKT_System.gurobi.GRB.Status.OPTIMAL:
         t = self.t_var.getAttr("x")
         return t
     else:
         return None
示例#15
0
 def F(x=None, z=None):
     if x is None: return 0, matrix(1.0, (n,1))
     X = V * spdiag(x) * V.T
     L = +X
     try:
         lapack.potrf(L)
     except ArithmeticError: return None
     f = - 2.0 * (log(L[0,0])  + log(L[1,1]))
     W = +V
     blas.trsm(L, W)
     gradf = matrix(-1.0, (1,2)) * W**2
     if z is None: return f, gradf
     H = matrix(0.0, (n,n))
     blas.syrk(W, H, trans='T')
     return f, gradf, z[0] * H**2
示例#16
0
    def cvxoptimize(c, A, k, *args, **kwargs):
        """Interface to the CVXOPT solver

            Definitions
            -----------
            "[a,b] array of floats" indicates array-like data with shape [a,b]
            n is the number of monomials in the gp
            m is the number of variables in the gp
            p is the number of posynomials in the gp

            Arguments
            ---------
            c : floats array of shape n
                Coefficients of each monomial
            A : floats array of shape (m,n)
                Exponents of the various free variables for each monomial.
            k : ints array of shape n
                number of monomials (columns of F) present in each constraint

            Returns
            -------
            dict
                Contains the following keys
                    "success": bool
                    "objective_sol" float
                        Optimal value of the objective
                    "primal_sol": floats array of size m
                        Optimal value of free variables. Note: not in logspace.
                    "dual_sol": floats array of size p
                        Optimal value of the dual variables, in logspace.
        """
        g = log(matrix(c))
        F = spmatrix(A.data, A.row, A.col, tc="d")
        solution = gpsolver(k, F, g)
        return dict(status=solution["status"], primal=solution["x"], la=solution["znl"])
示例#17
0
 def F(x=None, z=None):
     # The cvxopt matrix slicing does not include the last number.
     # x[0:d] is beta; x[d] is const; x[d+1:2*d+1] is t ; x[2*d+1:] is zeta
     if x is None: return 2 * d + 2*absN, matrix(0.0, (2*d+1+absN, 1))
     absS = absA * x[:d + 1]  # 0 - d contains the constant. Absolute label scores.
     cmpE = cmpA * x[:d + 1]
     cmpW = exp(cmpE)
     f = matrix(0.0,(2*d+1+2*absN,1))
     f[0] = absWeight*sum(x[2*d+1:])+ cmpWeight*(-sum(cmpE) + sum(log(1+cmpW))) + lamda * sum(x[d+1:2*d+1])
     f[1: d + 1] = x[:d] - x[d+1:2*d+1]  # beta - t <= 0
     f[d + 1: 2*d+1] = -x[:d] - x[d+1:2*d+1]  # -beta - t <= 0
     f[2*d+1:2*d+1+absN] = -absS-x[2*d+1:]+1 # -y_i(beta.T*x_i)-zeta_i+1 <=0
     f[2*d+1+absN:] = -x[2*d+1:]
     Df = matrix(0.0, (2*d+1+2*absN, 2*d+1+absN))
     Df[0, 0:d+1] =  cmpWeight * (matrix(cmpA.T * (div(cmpW, 1 + cmpW) - 1.0))).T
     Df[0, d+1 : 2*d+1] = lamda
     Df[0, 2*d+1:] = absWeight
     Df[1 : d+1, 0:d] = spdiag(matrix(1.0, (d, 1)))
     Df[d+1: 2*d+1, 0:d] = spdiag(matrix(-1.0, (d, 1)))
     Df[1 : d+1, d+1 : 2*d+1] = spdiag(matrix(-1.0, (d, 1)))
     Df[d+1 : 2*d+1, d+1 : 2*d+1] = spdiag(matrix(-1.0, (d, 1)))
     Df[2*d+1:2*d+1+absN, 0:d+1] = -absA
     Df[2*d+1:2*d+1+absN , 2*d+1:] = spdiag(matrix(-1.0,(absN,1)))
     Df[2*d+1+absN:,2*d+1:] = spdiag(matrix(-1.0,(absN,1)))
     if z is None: return f, Df
     H = matrix(0.0, (2*d+1+absN, 2*d+1+absN))
     H[0:d + 1, 0:d + 1] =  cmpWeight * (cmpA.T * spdiag(div(cmpW, (1 + cmpW) ** 2)) * cmpA)
     return f, Df, z[0] * H
    def F(x=None, z=None):
        if x is None:
            return 0, matrix(0.0, (n, 1))
        if max(abs(x)) >= 1.0:
            return None
        r = -b
        blas.gemv(A, x, r, beta=-1.0)
        w = x**2
        f = 0.5 * blas.nrm2(r)**2 - sum(log(1 - w))
        gradf = div(x, 1.0 - w)
        blas.gemv(A, r, gradf, trans='T', beta=2.0)
        if z is None:
            return f, gradf.T
        else:

            def Hf(u, v, alpha=1.0, beta=0.0):
                """
                   v := alpha * (A'*A*u + 2*((1+w)./(1-w)).*u + beta *v
               """
                v *= beta
                v += 2.0 * alpha * mul(div(1.0 + w, (1.0 - w)**2), u)
                blas.gemv(A, u, r)
                blas.gemv(A, r, v, alpha=alpha, beta=1.0, trans='T')

            return f, gradf.T, Hf
示例#19
0
文件: .grad_8nov.py 项目: tritm/ChuTo
 def func(x):
     z = numpy.reshape(x, (I, J))
     u = utility(z)
     f = -sum(log(sum(z[i][j] for j in range(J)))
              for i in range(I)) + q * sum(
                  math.exp(u[l]) for l in range(L))
     return f
示例#20
0
    def init1(self, dae):
        self.system.rmgen(self.gen)

        p0 = mul(self.u, self.system.Bus.Pg[self.a], self.gammap)
        q0 = mul(self.u, self.system.Bus.Qg[self.a], self.gammaq)
        v0 = mul(self.u, dae.y[self.v])
        theta0 = dae.y[self.a]
        v = polar(v0, theta0)
        S = p0 - q0 * 1j
        I = div(S, conj(v))
        E = v + mul(self.ra + self.xd1 * 1j, I)

        dae.y[self.p] = p0
        dae.y[self.q] = q0

        delta = log(div(E, abs(E) + 0j))
        dae.x[self.delta] = mul(self.u, delta.imag())
        dae.x[self.omega] = matrix(1.0, (self.n, 1), 'd')

        # d- and q-axis voltages and currents
        vdq = mul(self.u, mul(v, exp(jpi2 - delta)))
        idq = mul(self.u, mul(I, exp(jpi2 - delta)))
        vd = dae.y[self.vd] = vdq.real()
        vq = dae.y[self.vq] = vdq.imag()
        Id = dae.y[self.Id] = idq.real()
        Iq = dae.y[self.Iq] = idq.imag()

        # electro-mechanical torques / powers
        self.pm0 = mul(vq + mul(self.ra, Iq), Iq) + mul(
            vd + mul(self.ra, Id), Id)
        dae.y[self.pm] = self.pm0
示例#21
0
def testgp(opts):
    Aflr  = 1000.0  
    Awall = 100.0  
    alpha = 0.5  
    beta  = 2.0  
    gamma = 0.5  
    delta = 2.0  
 
    F = matrix( [[-1., 1., 1., 0., -1.,  1.,  0.,  0.],  
                 [-1., 1., 0., 1.,  1., -1.,  1., -1.],  
                 [-1., 0., 1., 1.,  0.,  0., -1.,  1.]])  
    g = log( matrix( [1.0, 2/Awall, 2/Awall, 1/Aflr, alpha, 1/beta, gamma, 
                      1/delta]) )  
    K = [1, 2, 1, 1, 1, 1, 1]  
    solvers.options.update(opts)
    sol = solvers.gp(K, F, g)
    #localcvx.options.update(opts)
    #sol = localcvx.gp(K, F, g, kktsolver='chol')
    if sol['status'] == 'optimal':
        x = sol['x']
        print "x=\n", helpers.strSpe(x, "%.17f")
        h, w, d = exp(x)
        print("\n h = %f,  w = %f, d = %f.\n" %(h,w,d))   
        print "\n *** running GO test ***"
        helpers.run_go_test("../testgp", {'x': x})
示例#22
0
def F(x=None, z=None):
   if x is None: return 0, matrix(0.0, (2,1))
   w = exp(A*x)
   f = c.T*x + sum(log(1+w))
   grad = c + A.T * div(w, 1+w)  
   if z is None: return f, grad.T
   H = A.T * spdiag(div(w,(1+w)**2)) * A
   return f, grad.T, z[0]*H 
def F(x=None, z=None):
   if x is None: return 0, matrix(0.0, (n+1,1))
   w = exp(A*x)
   f = dot(c,x) + sum(log(1+w)) 
   grad = c + A.T * div(w, 1+w)  
   if z is None: return matrix(f), grad.T
   H = A.T * spdiag(div(w,(1+w)**2)) * A
   return matrix(f), grad.T, z[0]*H 
示例#24
0
 def F(x=None, z=None):
     if x is None: return 0, matrix(1.0, (n, 1))
     if min(x) <= 0.0: return None
     f = -sum(log(x))
     Df = -(x**-1).T
     if z is None: return matrix(f), Df
     H = spdiag(z[0] * x**-2)
     return f, Df, H
示例#25
0
文件: acent.py 项目: sanurielf/cvxopt
 def F(x=None, z=None):
     if x is None:  return 0, matrix(1.0, (n,1))
     if min(x) <= 0.0:  return None
     f = -sum(log(x))
     Df = -(x**-1).T 
     if z is None: return matrix(f), Df
     H = spdiag(z[0] * x**-2)
     return f, Df, H
示例#26
0
文件: acent.py 项目: heath9/cvxpy
 def F(x=None, z=None):
     if x is None: return 0, cvxopt.matrix(1.0, (n,1))
     if min(x) <= 0.0: return None
     f = -sum(cvxopt.log(x))
     Df = -(x**-1).T
     if z is None: return f, Df
     H = cvxopt.spdiag(z[0] * x**-2)
     return f, Df, H
示例#27
0
文件: acent.py 项目: zhuiyuehun/cvxpy
 def F(x=None, z=None):
     if x is None: return 0, cvxopt.matrix(1.0, (n, 1))
     if min(x) <= 0.0: return None
     f = -sum(cvxopt.log(x))
     Df = -(x**-1).T
     if z is None: return f, Df
     H = cvxopt.spdiag(z[0] * x**-2)
     return f, Df, H
示例#28
0
 def func(self, x):  # {{{
     z = numpy.reshape(x, (self.I, self.J))
     u = self.utility(z)
     f = -sum(
         self.endhost_weight[i] * log(sum(z[i][j] for j in range(self.J)))
         for i in range(self.I)) + self.q * sum(
             math.exp(u[l]) for l in range(self.L))
     return f  # }}}
示例#29
0
def F(x=None, z=None):
    if x is None: return 0, matrix(0.0, (2, 1))
    w = exp(A * x)
    f = c.T * x + sum(log(1 + w))
    grad = c + A.T * div(w, 1 + w)
    if z is None: return f, grad.T
    H = A.T * spdiag(div(w, (1 + w)**2)) * A
    return f, grad.T, z[0] * H
示例#30
0
    def solve_KKT_system(self, p, ZERO=1.e-1000):
        import gurobipy as gurobi

        model = gurobi.Model("kkt")
        model.params.logToConsole = 0

        # Add the variables:
        t_var = None
        lambda_vars = dict()
        mu_vars = dict()

        t_var = model.addVar(obj=1., name="t")
        for x in self.X:
            for y in self.Y:
                lambda_vars[x, y] = model.addVar(name='lambda(%s,%s)' % (x, y))
        for x in self.X:
            for z in self.Y:
                mu_vars[x, z] = model.addVar(name='mu(%s,%s)' % (x, z))
        model.update()

        # Add the constraints:
        p_yz = marginal_yz_with_cutoff(p, ZERO)

        for x in self.X:
            for y in self.Y:
                for z in self.Z:
                    if (x, y, z) in p.keys() and p[x, y, z] > ZERO:
                        # equation
                        p_xyz = p[x, y, z]
                        rhs = -log(p_xyz / p_yz[y, z])  # >= 0
                        model.addConstr(
                            lambda_vars[x, y] + mu_vars[x, z] - rhs <= t_var,
                            name='eqn+(%s,%s,%s)' % (x, y, z))
                        model.addConstr(
                            lambda_vars[x, y] + mu_vars[x, z] - rhs >= -t_var,
                            name='eqn-(%s,%s,%s)' % (x, y, z))
                    else:
                        # inequality
                        if (y, z) in p_yz.keys() and p_yz[y, z] > 0:
                            rhs = 1.e400  # don't need ZERO here,  marginal_yz_w_cutoff()
                        else:
                            rhs = 0.
                        model.addConstr(
                            lambda_vars[x, y] + mu_vars[x, z] - rhs >= -t_var,
                            name='ieq(%s,%s,%s)' % (x, y, z))
                    # if
                #^ for z
            #^ for y
        #^ for x

        # Run Gurobi:
        model.optimize()

        if model.status == gurobi.GRB.Status.OPTIMAL:
            t = t_var.getAttr("x")
            return t
        else:
            return None
 def F(x=None, z=None):
     if x is None: return 0, matrix(0.0,(n,1))
     y = A*x+b
     if max(abs(y)) >= 1.0: return None
     f = -sum(log(1.0 - y**2))
     gradf = 2.0 * A.T * div(y, 1-y**2)
     if z is None: return f, gradf.T
     H = A.T * spdiag(2.0*z[0]*div(1.0+y**2,(1.0-y**2)**2))*A
     return f,gradf.T,H
示例#32
0
def gradient(p):
    grad = dict()
    p_yz = marginal_yz(p)
    for xyz,t in p.items():
        x,y,z = xyz
        if    p[xyz] > 0:     grad[xyz] = log(p_yz[y,z] / p[x,y,z])
        elif  p_yz[y,z] > 0:  grad[xyz] = 1.e400
        else:                 grad[xyz] = 0.
    return grad
示例#33
0
def gradient(p):
    grad = dict()
    p_yz = marginal_yz(p)
    for xyz, t in p.items():
        x, y, z = xyz
        if p[xyz] > 0: grad[xyz] = log(p_yz[y, z] / p[x, y, z])
        elif p_yz[y, z] > 0: grad[xyz] = 1.e400
        else: grad[xyz] = 0.
    return grad
示例#34
0
    def F(x=None, z=None):
        if x is None: return 0, x0
        if min(x) <= 0.0: return None
        f = -sum(log(x)) + e * np.random.normal()

        Df = -(x**-1).T + e * matrix(np.random.normal(n), (1, n))
        if z is None: return f, Df
        H = matrix(np.eye(n).astype(np.float))
        return f, Df, H
示例#35
0
def F(x=None, z=None):
    if x is None: return 0, matrix(0.0, (n, 1))
    y = A * x + b
    if max(abs(y)) >= 1.0: return None
    f = -sum(log(1.0 - y**2))
    gradf = 2.0 * A.T * div(y, 1 - y**2)
    if z is None: return f, gradf.T
    H = A.T * spdiag(2.0 * z[0] * div(1.0 + y**2, (1.0 - y**2)**2)) * A
    return f, gradf.T, H
示例#36
0
def F(x = None, z = None):  
     if x is None:  return 0, matrix(0.0, (3,1))  
     if max(abs(x)) >= 1.0:  return None  
     u = 1 - x**2  
     val = -sum(log(u))  
     Df = div(2*x, u).T  
     if z is None:  return val, Df  
     H = spdiag(2 * z[0] * div(1 + u**2, u**2))  
     return val, Df, H  
示例#37
0
    def try_to_improve_by_LP(self, p):
        import gurobipy as gurobi

        model = gurobi.Model("improve")
        model.params.logToConsole = 0

        p_yz = marginal_yz(p)

        # Add the variables:
        p_xyz_vars = dict()

        for x in self.X:
            for y in self.Y:
                for z in self.Z:
                    if (x, y, z) in p.keys() and p[x, y, z] > 0:
                        # equation
                        p_xyz = p[x, y, z]
                        obj = -log(p_xyz / p_yz[y, z])  # >= 0
                    else:
                        # inequality
                        if (y, z) in p_yz.keys() and p_yz[y, z] > 0:
                            obj = 1.e100
                        else:
                            obj = 0.
                    p_xyz_vars[x, y, z] = model.addVar(obj=rhs,
                                                       lb=0.,
                                                       name='p(%s,%s,%s)' %
                                                       (x, y, z))
                    # if
                #^ for z
            #^ for y
        #^ for x

        model.update()

        # Add constraints:
        for x in self.X:
            for y in self.Y:
                lambda_vars[x, y] = model.addVar(name='lambda(%s,%s)' % (x, y))
        for x in self.X:
            for z in self.Y:
                mu_vars[x, z] = model.addVar(name='mu(%s,%s)' % (x, z))
        model.update()

        # Add the constraints:
        p_yz = marginal_yz(p)

        # Run Gurobi:
        model.optimize()

        if model.status == gurobi.GRB.Status.OPTIMAL:
            t = t_var.getAttr("x")
            return t
        else:
            print("There has been a terrible mistake! [try_to_improve_LP()]")
            return 1.e400
示例#38
0
 def F(x=None, z=None):
     if x is None: return 0, matrix(1.0, (n,1))
     if min(x) <= 0.0: return None
     print(x)
     f = -sum(log(x))
     Df = -(x**-1).T
     if z is None: return f, Df
     print("H.size=", (z[0] * x**-2).size)
     H = spdiag(z[0] * x**-2)
     return f, Df, H
 def F(x=None, z=None):
     if x is None:
         return (0, cvx.matrix(min(np.linalg.eigvals(Sig)), (lenI, 1)))
     mat = ((nsko + 1) / nsko) * Sig - I_PI @ np.diag(
         list(x)) @ I_PI.transpose()
     f = -cvx.log(np.linalg.det(mat)) - nsko * cvx.sum(cvx.log(x))
     mat_inv = cvx.matrix(np.linalg.inv(mat))
     Df = mat_inv[cvx.matrix(I) * p + cvx.matrix(I)] - cvx.div(nsko, x)
     if z is None: return f, Df.T
     Matrix_list = []
     for i in range(lenI):
         I0 = cvx.matrix(0, (p, p))
         I0[I[i], I[i]] = 1
         A = -mat_inv * I0 * mat_inv
         Matrix_list.append(
             cvx.matrix(A[cvx.matrix(I) * p + cvx.matrix(I)], (1, lenI)))
     DDf = -cvx.matrix(Matrix_list, (lenI, lenI))
     H = cvx.sparse(DDf + cvx.spdiag(cvx.div(nsko, x**2)))
     return f, Df.T, z[0] * H
示例#40
0
 def F(x=None, z=None):
     if x is None: return 0, matrix(x0)
     y = h - G * x
     # we are assuming here that the center can sit on an edge
     if min(y) <= 0: return None
     # pretty standard log barrier
     f = -sum(log(y))
     Df = (y**-1).T * G
     if z is None: return matrix(f), Df
     H = G.T * spdiag(y**-2) * G
     return matrix(f), Df, z[0] * H
示例#41
0
    def logWeighting(self, x):
        """
        Log re-weighting function used in sparse optimization.

        Parameters
        ----------
        x: np.ndarray
            Array of parameters for weighting.
        """
        ncoeff = x.size[0]
        return log(div(blas.asum(x) + ncoeff * self.eps, abs(x) + self.eps))
示例#42
0
文件: log.py 项目: chrisdembia/cvxpy
 def F(x=None, z=None):
     # x = (t1, t2)
     # t1 - log(t2) <= 0
     if x is None: return m, cvxopt.matrix(m*[0.0] + m*[1.0])
     if min(x[m:]) <= 0.0: return None
     f = x[0:m] - cvxopt.log(x[m:])
     Df = cvxopt.sparse([[cvxopt.spdiag(cvxopt.matrix(1.0, (m,1)))], [cvxopt.spdiag(-(x[m:]**-1))]])
     if z is None: return f, Df
     ret = cvxopt.mul(z, x[m:]**-2)
     # TODO: add regularization for the Hessian?
     H = cvxopt.spdiag(cvxopt.matrix([cvxopt.matrix(0, (m,1)), ret]))
     return f, Df, H
示例#43
0
    def make_KKT_lp(self, p, filename):
        x_idx = dict()
        for x in self.X:
            x_idx[x] = len(x_idx)
        y_idx = dict()
        for y in self.Y:
            y_idx[y] = len(y_idx)
        z_idx = dict()
        for z in self.Z:
            z_idx[z] = len(z_idx)

        p_yz = marginal_yz(p)

        filecontent = ""
        filecontent += "Minimize\n"
        filecontent += "Obj: t\n"
        filecontent += "Subject To\n"
        for x in self.X:
            for y in self.Y:
                for z in self.Z:
                    lhs = ""
                    lhs += " lambda" + str(x_idx[x]) + "_" + str(y_idx[y])
                    lhs += " + "
                    lhs += " mu" + str(x_idx[x]) + "_" + str(z_idx[z])
                    if (x, y, z) in p.keys() and p[x, y, z] > 0:
                        # equation
                        p_xzy = p[x, y, z]
                        rhs = -1000 * log(p_xzy / p_yz[y, z])  # >= 0
                        filecontent += "p(" + str(x_idx[x]) + "," + str(
                            y_idx[y]) + "," + str(
                                z_idx[z]) + "):  " + lhs + "   -t <= " + str(
                                    rhs) + "\n"
                        filecontent += "p(" + str(x_idx[x]) + "," + str(
                            y_idx[y]) + "," + str(
                                z_idx[z]) + "):  " + lhs + "   +t >= " + str(
                                    rhs) + "\n"
                    else:
                        # inequality
                        if (y, z) in p_yz.keys() and p_yz[y, z] > 0:
                            rhs = 1.e100
                        else:
                            rhs = 0
                        filecontent += "p(" + str(x_idx[x]) + "," + str(
                            y_idx[y]) + "," + str(
                                z_idx[z]) + "):  " + lhs + "   +t >= " + str(
                                    rhs) + "\n"
                #^ for
            #^ for
        #^ for
        filecontent += "END\n"
        print("Writing KKT system to file ", filename)
        with open(filename, 'w') as thefile:
            thefile.write(filecontent)
示例#44
0
    def try_to_improve_by_LP(self, p):
        import gurobipy as gurobi

        model = gurobi.Model("improve")
        model.params.logToConsole = 0

        p_yz = marginal_yz(p)

        # Add the variables:
        p_xyz_vars = dict()

        for x in self.X:
            for y in self.Y:
                for z in self.Z:
                    if (x,y,z) in p.keys() and p[x,y,z] > 0:
                        # equation
                        p_xyz = p[x,y,z]
                        obj = -log(p_xyz/p_yz[y,z])  # >= 0
                    else:
                        # inequality
                        if (y,z) in p_yz.keys() and p_yz[y,z] > 0:    obj = 1.e100
                        else:                                         obj = 0.
                    p_xyz_vars[x,y,z] = model.addVar( obj=rhs, lb=0., name='p(%s,%s,%s)' % (x,y,z))
                    # if
                #^ for z
            #^ for y
        #^ for x

        model.update()

        # Add constraints:
        for x in self.X:
            for y in self.Y:
                lambda_vars[x,y] = model.addVar(name='lambda(%s,%s)' % (x,y))
        for x in self.X:
            for z in self.Y:
                mu_vars[x,z] = model.addVar(name='mu(%s,%s)' % (x,z))
        model.update()

        # Add the constraints:
        p_yz = marginal_yz(p)


        # Run Gurobi:
        model.optimize();

        if model.status == gurobi.GRB.Status.OPTIMAL:
            t = t_var.getAttr("x")
            return t
        else:
            print("There has been a terrible mistake! [try_to_improve_LP()]")
            return 1.e400
示例#45
0
def kl_divergence(Of,From): # KL-divergence of Q from P
    Q=Of
    P=From
    thesum = 0.
    for x,q in Q.items():
        if q>0:
            if x in P.keys():
                p = P[x]
                if    p>0:  thesum += q*log(q/p)
                else:       thesum = 1.e+400
            else:
                thesum = 1.e+400
    return thesum;
示例#46
0
    def solve_KKT_system(self, p, ZERO=1.e-1000):
        import gurobipy as gurobi

        model = gurobi.Model("kkt")
        model.params.logToConsole = 0


        # Add the variables:
        t_var       = None
        lambda_vars = dict()
        mu_vars     = dict()

        t_var = model.addVar(obj=1., name="t")
        for x in self.X:
            for y in self.Y:
                lambda_vars[x,y] = model.addVar(name='lambda(%s,%s)' % (x,y))
        for x in self.X:
            for z in self.Y:
                mu_vars[x,z] = model.addVar(name='mu(%s,%s)' % (x,z))
        model.update()

        # Add the constraints:
        p_yz = marginal_yz_with_cutoff(p,ZERO)

        for x in self.X:
            for y in self.Y:
                for z in self.Z:
                    if (x,y,z) in p.keys() and p[x,y,z] > ZERO:
                        # equation
                        p_xyz = p[x,y,z]
                        rhs = -log(p_xyz/p_yz[y,z])  # >= 0
                        model.addConstr( lambda_vars[x,y] + mu_vars[x,z] - rhs <= t_var , name='eqn+(%s,%s,%s)' % (x,y,z))
                        model.addConstr( lambda_vars[x,y] + mu_vars[x,z] - rhs >= -t_var , name='eqn-(%s,%s,%s)' % (x,y,z))
                    else:
                        # inequality
                        if (y,z) in p_yz.keys() and p_yz[y,z] > 0:    rhs = 1.e400       # don't need ZERO here,  marginal_yz_w_cutoff()
                        else:                                         rhs = 0.
                        model.addConstr( lambda_vars[x,y] + mu_vars[x,z] - rhs >= -t_var , name='ieq(%s,%s,%s)' % (x,y,z))
                    # if
                #^ for z
            #^ for y
        #^ for x

        # Run Gurobi:
        model.optimize();

        if model.status == gurobi.GRB.Status.OPTIMAL:
            t = t_var.getAttr("x")
            return t
        else:
            return None
示例#47
0
def acent(A, b):
    """  
    Computes analytic center of A*x <= b with A m by n of rank n. 
    We assume that b > 0 and the feasible set is bounded.
    """

    MAXITERS = 100
    ALPHA = 0.01
    BETA = 0.5
    TOL = 1e-8

    ntdecrs = []
    m, n = A.size
    x = matrix(0.0, (n, 1))
    H = matrix(0.0, (n, n))

    for iter in range(MAXITERS):

        # Gradient is g = A^T * (1./(b-A*x)).
        d = (b - A * x) ** -1
        g = A.T * d

        # Hessian is H = A^T * diag(1./(b-A*x))^2 * A.
        Asc = mul(d[:, n * [0]], A)
        blas.syrk(Asc, H, trans="T")

        # Newton step is v = H^-1 * g.
        v = -g
        lapack.posv(H, v)

        # Directional derivative and Newton decrement.
        lam = blas.dot(g, v)
        ntdecrs += [sqrt(-lam)]
        print("%2d.  Newton decr. = %3.3e" % (iter, ntdecrs[-1]))
        if ntdecrs[-1] < TOL:
            return x, ntdecrs

        # Backtracking line search.
        y = mul(A * v, d)
        step = 1.0
        while 1 - step * max(y) < 0:
            step *= BETA
        while True:
            if -sum(log(1 - step * y)) < ALPHA * step * lam:
                break
            step *= BETA
        x += step * v
    def test_problem_expdesign(self):

        # test problem needs review
        print 'skipping, needs review'
        return
        
        from cvxpy import (matrix, variable, program, minimize,
                           log, det_rootn, diag, sum, geq, eq, zeros)
        tol_exp = 6
        V = matrix(self.V)
        n = V.shape[1]
        x = variable(n)

        # Use cvxpy to solve the problem above
        p = program(minimize(-log(det_rootn(V*diag(x)*V.T))),
                    [geq(x, 0.0), eq(sum(x), 1.0)])
        p.solve(True)
        np.testing.assert_array_almost_equal(
            x.value, self.xd, tol_exp)
    def test_problem_penalty(self):
        """
        Compare cvxpy solutions to cvxopt ground truth
        """

        from cvxpy import (matrix,variable,program,minimize,
                           sum,abs,norm2,log,square,zeros,max,
                           hstack,vstack)

        m, n = self.m, self.n
        A = matrix(self.A)
        b = matrix(self.b)

        # set tolerance to 5 significant digits
        tol_exp = 5

        # l1 approximation
        x = variable(n)
        p = program(minimize(sum(abs(A*x + b))))
        p.solve(True)
        np.testing.assert_array_almost_equal(x.value,self.x1,tol_exp)

        # l2 approximation
        x = variable(n)
        p = program(minimize(norm2(A*x + b)))
        p.solve(True)
        np.testing.assert_array_almost_equal(x.value,self.x2,tol_exp)

        # Deadzone approximation - implementation is currently ugly (need max along axis)
        x = variable(n)
        Axbm = abs(A*x+b)-0.5
        Axbm_deadzone = vstack([max(hstack((Axbm[i,0],0.0))) for i in range(m)])
        p = program(minimize(sum(Axbm_deadzone)))
        p.solve(True)
        obj_dz_cvxpy = np.sum(np.max([np.abs(A*x.value+b)-0.5,np.zeros((m,1))],axis=0))
        np.testing.assert_array_almost_equal(obj_dz_cvxpy,self.obj_dz,tol_exp)

        # Log barrier
        x = variable(n)
        p = program(minimize(-sum(log(1.0-square(A*x + b)))))
        p.solve(True)
        np.testing.assert_array_almost_equal(x.value,self.cxlb,tol_exp)
示例#50
0
    def make_KKT_lp(self,p,filename):
        x_idx = dict()
        for x in self.X:
            x_idx[x] = len(x_idx)
        y_idx = dict()
        for y in self.Y:
            y_idx[y] = len(y_idx)
        z_idx = dict()
        for z in self.Z:
            z_idx[z] = len(z_idx)

        p_yz = marginal_yz(p)

        filecontent = ""
        filecontent += "Minimize\n"
        filecontent += "Obj: t\n"
        filecontent += "Subject To\n"
        for x in self.X:
            for y in self.Y:
                for z in self.Z:
                    lhs = ""
                    lhs += " lambda"+str(x_idx[x])+"_"+str(y_idx[y])
                    lhs += " + "
                    lhs += " mu"+str(x_idx[x])+"_"+str(z_idx[z])
                    if (x,y,z) in p.keys() and p[x,y,z] > 0:
                        # equation
                        p_xzy = p[x,y,z]
                        rhs = -1000*log(p_xzy/p_yz[y,z])  # >= 0
                        filecontent += "p("+str(x_idx[x])+","+str(y_idx[y])+","+str(z_idx[z])+"):  "+lhs+"   -t <= "+str(rhs)+"\n"
                        filecontent += "p("+str(x_idx[x])+","+str(y_idx[y])+","+str(z_idx[z])+"):  "+lhs+"   +t >= "+str(rhs)+"\n"
                    else:
                        # inequality
                        if (y,z) in p_yz.keys() and p_yz[y,z] > 0:    rhs = 1.e100
                        else:                                         rhs = 0
                        filecontent += "p("+str(x_idx[x])+","+str(y_idx[y])+","+str(z_idx[z])+"):  "+lhs+"   +t >= "+str(rhs)+"\n"
                #^ for
            #^ for
        #^ for
        filecontent += "END\n"
        print("Writing KKT system to file ",filename)
        with open(filename, 'w') as thefile:
            thefile.write(filecontent)
示例#51
0
文件: _cvxopt.py 项目: hoburg/gpkit
def cvxoptimize(c, A, k, *args, **kwargs):
    """Interface to the CVXOPT solver

        Definitions
        -----------
        "[a,b] array of floats" indicates array-like data with shape [a,b]
        n is the number of monomials in the gp
        m is the number of variables in the gp
        p is the number of posynomials in the gp

        Arguments
        ---------
        c : floats array of shape n
            Coefficients of each monomial
        A : floats array of shape (m,n)
            Exponents of the various free variables for each monomial.
        k : ints array of shape n
            number of monomials (columns of F) present in each constraint

        Returns
        -------
        dict
            Contains the following keys
                "success": bool
                "objective_sol" float
                    Optimal value of the objective
                "primal_sol": floats array of size m
                    Optimal value of free variables. Note: not in logspace.
                "dual_sol": floats array of size p
                    Optimal value of the dual variables, in logspace.
    """
    gpsolver = gp if cvxopt_version >= "1.1.8" else gp118
    # above use of gp118 is a local hack for windows
    # until Python (x,y) updates their cvxopt version

    g = log(matrix(c))
    F = spmatrix(A.data, A.row, A.col, tc='d')
    solution = gpsolver(k, F, g, *args, **kwargs)
    return dict(status=solution['status'],
                primal=solution['x'],
                la=solution['znl'])
示例#52
0
    def check_KKT_sol(self,p,why):
        p_yz = marginal_yz(p)
        viol = -1.

        for x in self.X:
            for y in self.Y:
                for z in self.Z:
                    try:               idx_xy = self.marg_of_idx.index((x,y,None))
                    except ValueError: idx_xy = None
                    try:               idx_xz = self.marg_of_idx.index((x,None,z))
                    except ValueError: idx_xz = None

                    if idx_xy == None:  lambda_xy = None
                    else:               lambda_xy = why[idx_xy]
                    if idx_xz == None:  mu_xz = None
                    else:               mu_xz = why[idx_xz]

                    if (x,y,z) in p.keys() and p[x,y,z] > 0:
                        # equation
                        p_xzy = p[x,y,z]
                        rhs = -log(p_xzy/p_yz[y,z])  # >= 0
                        viol = max(viol, abs( lambda_xy + mu_xz - rhs ) )
                    else:
                        # inequality
                        if (y,z) in p_yz.keys() and p_yz[y,z] > 0:
                            if lambda_xy==None or mu_xz==None:
                                pass
                            else:
                                rhs = 1.e400
                                viol = max(viol, rhs - (lambda_xy + mu_xz) )
                        else:
                            rhs = 0.
                            viol = max(viol, rhs - (lambda_xy + mu_xz) )
                    # if
                #^ for z
            #^ for y
        #^ for x
        return viol
示例#53
0
 def F(x = None, z = None):
     if x is None: 
         return 0, matrix(0.0, (n,1))
     if max(abs(x)) >= 1.0: 
         return None 
     r = - b
     blas.gemv(A, x, r, beta = -1.0)
     w = x**2
     f = 0.5 * blas.nrm2(r)**2  - sum(log(1-w))
     gradf = div(x, 1.0 - w)
     blas.gemv(A, r, gradf, trans = 'T', beta = 2.0)
     if z is None:
         return f, gradf.T
     else:
         def Hf(u, v, alpha = 1.0, beta = 0.0):
            """
                v := alpha * (A'*A*u + 2*((1+w)./(1-w)).*u + beta *v
            """
            v *= beta
            v += 2.0 * alpha * mul(div(1.0+w, (1.0-w)**2), u)
            blas.gemv(A, u, r)
            blas.gemv(A, r, v, alpha = alpha, beta = 1.0, trans = 'T')
         return f, gradf.T, Hf
示例#54
0
#A = matrix([[1, 2, 3]])
n = 1000
A = matrix(linspace(1,n,num=n))
#print A

n = A.size[0]
print n

eps = 1.0


F = matrix(np.vstack([matlib.eye(n)*(-2), matlib.eye(n)])) 
#print F
#print type(F)

g = log(matrix(np.vstack([A, matlib.ones((n,1))*eps/n]) ))
#print g
#print type(g)

K = [n, n]

#x1, x2, x3 = exp( solvers.gp(K, F, g)['x'] ) 
#print "Solution (x1,x2,x3) =", x1, x2, x3

start_time = time.clock()
x = exp( solvers.gp(K, F, g)['x'] ) 
#print "Solution (x1,x2,x3) =", x

print "time elapsed ",time.clock() - start_time 

示例#55
0
文件: gp.py 项目: sanurielf/cvxopt
# The small GP of section 9.3 (Geometric programming).

from cvxopt import matrix, log, exp, solvers  
 
Aflr  = 1000.0  
Awall = 100.0  
alpha = 0.5  
beta  = 2.0  
gamma = 0.5  
delta = 2.0  
 
F = matrix( [[-1., 1., 1., 0., -1.,  1.,  0.,  0.],  
             [-1., 1., 0., 1.,  1., -1.,  1., -1.],  
             [-1., 0., 1., 1.,  0.,  0., -1.,  1.]])  
g = log( matrix( [1.0, 2/Awall, 2/Awall, 1/Aflr, alpha, 1/beta, gamma, 
    1/delta]) )  
K = [1, 2, 1, 1, 1, 1, 1]  
h, w, d = exp( solvers.gp(K, F, g)['x'] )
print("\n h = %f,  w = %f, d = %f.\n" %(h,w,d))   
示例#56
0
    pylab.ylabel('Deadzone')
    pylab.axis([-1.5, 1.5, 0, 20])


# Log barrier
#
# minimize -sum (log ( 1.0 - A*x+b)**2)

def F(x=None, z=None):
    if x is None: return 0, matrix(0.0, (n,1))
    y = A*x+b
    if max(abs(y)) >= 1.0: return None
    f = -sum(log(1.0 - y**2))
    gradf = 2.0 * A.T * div(y, 1-y**2)
    if z is None: return f, gradf.T
    H = A.T * spdiag(2.0 * z[0] * div( 1.0+y**2, (1.0 - y**2)**2 )) * A
    return f, gradf.T, H
xlb = solvers.cp(F)['x']

if pylab_installed:
    pylab.subplot(414)
    pylab.hist(A*xlb+b, numpy.array(bins))
    nopts = 200
    pylab.plot(xs, (8.0/1.5**2) * xs**2, 'g--')
    xs2 = -0.99999 + (2*0.99999 /(nopts-1)) * matrix(list(range(nopts)))
    pylab.plot(xs2, -3.0 * log(1.0 - abs(xs2)**2), 'g-')
    pylab.ylabel('Log barrier')
    pylab.xlabel('residual')
    pylab.axis([-1.5, 1.5, 0, 10])
    pylab.show()