Beispiel #1
0
def policy(G, R0, L, d, u_next, gamma):

    [m,temp]=d.shape
    [A, temp, n]=G.shape

#    GG= np.zeros((n*n,n*A))
    GG = sparse.lil_matrix((n * n, n * A))

    for i in range(n):
        for j in range(n):
            temp_g = np.zeros((1,A))
            for k in range(A):
                temp_g[:,[k]] = G[k,i,j]
            GG[i*n+j,j*A:j*A+A] = temp_g

#    FF = np.zeros((n*n,n*n))
    FF = sparse.lil_matrix((n * n, n * n))
    for i in range(n):
        for j in range(n):
           FF[i*n+j,j*n+i] = 1

#    RR=np.zeros((n,n*A))
    RR = sparse.lil_matrix((n, n * A))
    for i in range(n):
        RR[i,i*A:i*A+A] = R0[i,:]

#    LL1=np.zeros((m*n,n*n))
    LL1 = sparse.lil_matrix((m * n, n * n))
    for i in range(n):
        LL1[i*m:i*m+m,i*n:i*n+n]=L

#    LL2=np.zeros((m*n,m*m))
    LL2 = sparse.lil_matrix((m * n, m * m))
    for i in range(n):
        for j in range(m):
            # LL2[i*m:i*m+m,j*m:j*m+m]=L[j,i]*np.eye(m)
            LL2[i*m:i*m+m,j*m:j*m+m]=L[j,i]* np.eye(m) # cannot use sparse.eye(m)

#    EE=np.zeros((m*n,m))
    EE = sparse.lil_matrix((m*n,m))
    for i in range(n):
        # EE[i*m:i*m+m,:]= np.eye(m)
        EE[i*m:i*m+m,:]= np.eye(m) # cannot use sparse.eye(m)
 
#    UU=np.zeros((n,n*n))
    UU = sparse.lil_matrix((n,n*n))
    for i in range(n):
        UU[i,i*n:i*n+n]=gamma * u_next

#    OO=np.zeros((n,n*A))
    OO = sparse.lil_matrix((n,n*A))
    for i in range(n):
        OO[i,i*A:i*A+A]= np.ones((1,A))

#    DD=np.zeros((m,m*m))
    DD= sparse.lil_matrix((m,m*m))
    for i in range(m):
        #DD[:,i*m:i*m+m]=d[i]*np.eye(m)
        DD[:,i*m:i*m+m]=d[i] * np.eye(m)

#    e_n= np.eye(n)
#    e_m=np.eye(m)
#    e_mn=np.eye(m*n)
#    e_mm= np.eye(m*m)
#    e_nA= np.eye(n*A)
    e_n = sparse.eye(n)
    e_m = sparse.eye(m)
    e_mn = sparse.eye(m*n)
    e_mm = sparse.eye(m*m)
    e_nA = sparse.eye(n*A)

#    z_m_1= np.zeros((m,1))
#    z_m_m= np.zeros((m,m))
#    z_m_n= np.zeros((m,n))
#    z_m_mm= np.zeros((m,m*m))
#    z_m_nn= np.zeros((m,n*n))
#    z_m_mn= np.zeros((m,m*n))
#    z_m_nA= np.zeros((m,n*A))
#
#    z_n_1= np.zeros((n,1))
#    z_n_m= np.zeros((n,m))
#    z_n_n= np.zeros((n,n))
#    z_n_mm= np.zeros((n,m*m))
#    z_n_nn= np.zeros((n,n*n))
#    z_n_mn= np.zeros((n,m*n))
#    z_n_nA= np.zeros((n,n*A))
#
#    z_mm_1= np.zeros((m*m,1))
#    z_mm_m= np.zeros((m*m,m))
#    z_mm_n= np.zeros((m*m,n))
#    z_mm_mm= np.zeros((m*m,m*m))
#    z_mm_nn= np.zeros((m*m,n*n))
#    z_mm_mn= np.zeros((m*m,m*n))
#    z_mm_nA= np.zeros((m*m,n*A))
#
#    z_nn_1= np.zeros((n*n,1))
#    z_nn_m= np.zeros((n*n,m))
#    z_nn_n= np.zeros((n*n,n))
#    z_nn_mm= np.zeros((n*n,m*m))
#    z_nn_nn= np.zeros((n*n,n*n))
#    z_nn_mn= np.zeros((n*n,m*n))
#    z_nn_nA= np.zeros((n*n,n*A))
#
#    z_mn_1= np.zeros((m*n,1))
#    z_mn_m= np.zeros((m*n,m))
#    z_mn_n= np.zeros((m*n,n))
#    z_mn_mm= np.zeros((m*n,m*m))
#    z_mn_nn= np.zeros((m*n,n*n))
#    z_mn_mn= np.zeros((m*n,m*n))
#    z_mn_nA= np.zeros((m*n,n*A))
#
#    z_nA_1= np.zeros((n*A,1))
#    z_nA_m= np.zeros((n*A,m))
#    z_nA_n= np.zeros((n*A,n))
#    z_nA_mm= np.zeros((n*A,m*m))
#    z_nA_nn= np.zeros((n*A,n*n))
#    z_nA_mn= np.zeros((n*A,m*n))
#    z_nA_nA= np.zeros((n*A,n*A))

    z_m_1= sparse.lil_matrix((m,1))
    z_m_m= sparse.lil_matrix((m,m))
    z_m_n= sparse.lil_matrix((m,n))
    z_m_mm= sparse.lil_matrix((m,m*m))
    z_m_nn= sparse.lil_matrix((m,n*n))
    z_m_mn= sparse.lil_matrix((m,m*n))
    z_m_nA= sparse.lil_matrix((m,n*A))

    z_n_1= sparse.lil_matrix((n,1))
    z_n_m= sparse.lil_matrix((n,m))
    z_n_n= sparse.lil_matrix((n,n))
    z_n_mm= sparse.lil_matrix((n,m*m))
    z_n_nn= sparse.lil_matrix((n,n*n))
    z_n_mn= sparse.lil_matrix((n,m*n))
    z_n_nA= sparse.lil_matrix((n,n*A))

    z_mm_1= sparse.lil_matrix((m*m,1))
    z_mm_m= sparse.lil_matrix((m*m,m))
    z_mm_n= sparse.lil_matrix((m*m,n))
    z_mm_mm= sparse.lil_matrix((m*m,m*m))
    z_mm_nn= sparse.lil_matrix((m*m,n*n))
    z_mm_mn= sparse.lil_matrix((m*m,m*n))
    z_mm_nA= sparse.lil_matrix((m*m,n*A))

    z_nn_1= sparse.lil_matrix((n*n,1))
    z_nn_m= sparse.lil_matrix((n*n,m))
    z_nn_n= sparse.lil_matrix((n*n,n))
    z_nn_mm= sparse.lil_matrix((n*n,m*m))
    z_nn_nn= sparse.lil_matrix((n*n,n*n))
    z_nn_mn= sparse.lil_matrix((n*n,m*n))
    z_nn_nA= sparse.lil_matrix((n*n,n*A))

    z_mn_1= sparse.lil_matrix((m*n,1))
    z_mn_m= sparse.lil_matrix((m*n,m))
    z_mn_n= sparse.lil_matrix((m*n,n))
    z_mn_mm= sparse.lil_matrix((m*n,m*m))
    z_mn_nn= sparse.lil_matrix((m*n,n*n))
    z_mn_mn= sparse.lil_matrix((m*n,m*n))
    z_mn_nA= sparse.lil_matrix((m*n,n*A))

    z_nA_1= sparse.lil_matrix((n*A,1))
    z_nA_m= sparse.lil_matrix((n*A,m))
    z_nA_n= sparse.lil_matrix((n*A,n))
    z_nA_mm= sparse.lil_matrix((n*A,m*m))
    z_nA_nn= sparse.lil_matrix((n*A,n*n))
    z_nA_mn= sparse.lil_matrix((n*A,m*n))
    z_nA_nA= sparse.lil_matrix((n*A,n*A))


#    Aeq_r1= np.concatenate((GG,           -FF,          z_nn_mn,     z_nn_mm,     z_nn_n,     z_nn_m,     z_nn_n,      z_nn_m,     z_nn_1), axis=1)
#    Aeq_r2= np.concatenate((RR,           z_n_nn,       z_n_mn,      z_n_mm,      z_n_n,      z_n_m,      -e_n,        z_n_m,      z_n_1), axis=1)
#    Aeq_r3= np.concatenate((z_n_nA,       UU,           z_n_mn,      z_n_mm,      -e_n,       z_n_m,      e_n,         z_n_m,      z_n_1), axis=1)
#    Aeq_r4= np.concatenate((z_mn_nA,      LL1,          e_mn,        -LL2,        z_mn_n,     z_mn_m,     z_mn_n,      EE,         z_mn_1), axis=1)
#    Aeq_r5= np.concatenate((OO,           z_n_nn,       z_n_mn,      z_n_mm,      z_n_n,      z_n_m,      z_n_n,       z_n_m,      z_n_1), axis=1)
#
#    Aeq= np.concatenate((Aeq_r1, Aeq_r2, Aeq_r3, Aeq_r4, Aeq_r5), axis=0)
#    beq= np.concatenate((z_nn_1,   z_n_1,   z_n_1,   z_mn_1,   np.ones((n,1))), axis=0)
#
#    Aineq_r1= np.concatenate((z_m_nA,     z_m_nn,       z_m_mn,      DD,          z_m_n,      z_m_m,      z_m_n,       -e_m,       z_m_1), axis=1)
#    Aineq_r2= np.concatenate((z_n_nA,     z_n_nn,       z_n_mn,      z_n_mm,      -e_n,       -L.T,       z_n_n,       z_n_m,      np.ones((n,1))), axis=1)
#    Aineq_r3= np.concatenate((-e_nA,      z_nA_nn,      z_nA_mn,     z_nA_mm,     z_nA_n,     z_nA_m,     z_nA_n,      z_nA_m,     z_nA_1), axis=1)
#    Aineq_r4= np.concatenate((z_mn_nA,    z_mn_nn,      -e_mn,       z_mn_mm,     z_mn_n,     z_mn_m,     z_mn_n,      z_mn_m,     z_mn_1), axis=1)
#    Aineq_r5= np.concatenate((z_mm_nA,    z_mm_nn,      z_mm_mn,     -e_mm,       z_mm_n,     z_mm_m,     z_mm_n,      z_mm_m,     z_mm_1), axis=1)
#    Aineq_r6= np.concatenate((z_m_nA,     z_m_nn,       z_m_mn,      z_m_mm,      z_m_n,      -e_m,       z_m_n,       z_m_m,      z_m_1), axis=1)
#
#    c= np.concatenate((z_nA_1,       z_nn_1,      z_mn_1,     z_mm_1,     z_n_1,     d,        z_n_1,      z_m_1,      -np.ones((1,1))), axis=0)
#
#    Aineq= np.concatenate((Aineq_r1, Aineq_r2, Aineq_r3, Aineq_r4, Aineq_r5, Aineq_r6), axis=0)
#    bineq= np.concatenate((d,        z_n_1,     z_nA_1,     z_mn_1,     z_mm_1,     z_m_1), axis=0)

    Aeq_r1= sparse.hstack([GG,           -FF,          z_nn_mn,     z_nn_mm,     z_nn_n,     z_nn_m,     z_nn_n,      z_nn_m,     z_nn_1])
    Aeq_r2= sparse.hstack([RR,           z_n_nn,       z_n_mn,      z_n_mm,      z_n_n,      z_n_m,      -e_n,        z_n_m,      z_n_1])
    Aeq_r3= sparse.hstack([z_n_nA,       UU,           z_n_mn,      z_n_mm,      -e_n,       z_n_m,      e_n,         z_n_m,      z_n_1])
    Aeq_r4= sparse.hstack([z_mn_nA,      LL1,          e_mn,        -LL2,        z_mn_n,     z_mn_m,     z_mn_n,      EE,         z_mn_1])
    Aeq_r5= sparse.hstack([OO,           z_n_nn,       z_n_mn,      z_n_mm,      z_n_n,      z_n_m,      z_n_n,       z_n_m,      z_n_1])

    Aeq= sparse.vstack([Aeq_r1, Aeq_r2, Aeq_r3, Aeq_r4, Aeq_r5])
    beq= sparse.vstack([z_nn_1,   z_n_1,   z_n_1,   z_mn_1,   np.ones((n,1))])

    Aineq_r1= sparse.hstack([z_m_nA,     z_m_nn,       z_m_mn,      DD,          z_m_n,      z_m_m,      z_m_n,       -e_m,       z_m_1])
    Aineq_r2= sparse.hstack([z_n_nA,     z_n_nn,       z_n_mn,      z_n_mm,      -e_n,       -L.T,       z_n_n,       z_n_m,      np.ones((n,1))])
    Aineq_r3= sparse.hstack([-e_nA,      z_nA_nn,      z_nA_mn,     z_nA_mm,     z_nA_n,     z_nA_m,     z_nA_n,      z_nA_m,     z_nA_1])
    Aineq_r4= sparse.hstack([z_mn_nA,    z_mn_nn,      -e_mn,       z_mn_mm,     z_mn_n,     z_mn_m,     z_mn_n,      z_mn_m,     z_mn_1])
    Aineq_r5= sparse.hstack([z_mm_nA,    z_mm_nn,      z_mm_mn,     -e_mm,       z_mm_n,     z_mm_m,     z_mm_n,      z_mm_m,     z_mm_1])
    Aineq_r6= sparse.hstack([z_m_nA,     z_m_nn,       z_m_mn,      z_m_mm,      z_m_n,      -e_m,       z_m_n,       z_m_m,      z_m_1])

    c= sparse.vstack([z_nA_1,       z_nn_1,      z_mn_1,     z_mm_1,     z_n_1,     d,        z_n_1,      z_m_1,      -np.ones((1,1))])

    Aineq= sparse.vstack([Aineq_r1, Aineq_r2, Aineq_r3, Aineq_r4, Aineq_r5, Aineq_r6])
    bineq= sparse.vstack([0.85 * d,        z_n_1,     z_nA_1,     z_mn_1,     z_mm_1,     z_m_1])

#    Aeq= matrix(Aeq.toarray())
#    beq= matrix(beq)
#    Aineq= matrix(Aineq.toarray())
#    bineq= matrix(bineq)
#    c= matrix(c)
    
    # note: toarray() might not be efficient
    Aeq = cvxtool.scipy_sparse_to_spmatrix(Aeq.tocoo())
    beq = matrix(beq.toarray())
    Aineq = cvxtool.scipy_sparse_to_spmatrix(Aineq.tocoo())
    bineq = matrix(bineq.toarray())
    c = matrix(c.toarray()) 

#    Aeq = Aeq.toarray() 
#    beq = beq.toarray()
#    Aineq = Aineq.toarray()
#    bineq = bineq.toarray()
#    c = c.toarray()[:,0] 

#    sol = linprog(c,Aineq,bineq,Aeq,beq)
#    var = np.zeros((len(sol['x']), 1))
#    var[:,0] = sol['x']
#    optval = sol['fun']
#    print(optval)

# call solver
    sol=solvers.lp(c,Aineq,bineq,Aeq,beq, solver = 'mosek')
    var = sparse.lil_matrix(sol['x'])
    optval=np.array(sol['primal objective'])
    print(optval)
#    print("y: ", var[n*A + n*n + m*n +m*m +n:n*A + n*n + m*n +m*m +n + m].toarray())
#    print("z: ", var[-1].toarray()) 
#    print("solution: ", sol)
#    print("optval: ", optval)

#    temp_q =var[0:n*A,:]
#    Q=temp_q.reshape(n,A)
    temp_q = sparse.lil_matrix(var[0:n*A,:])
    Q = temp_q.reshape((n,A))

#    M=np.zeros((n,n))
#    for i in range(n):
#        for j in range(n):
#            for k in range(A):
#                M[i,j]=M[i,j]+G[k,i,j]*Q[j,k]
    
    M = sparse.lil_matrix((n,n))
    for i in range(n):
        for j in range(n):
            for k in range(A):
                M[i,j]=M[i,j]+G[k,i,j]*Q[j,k]
   
    U = sparse.lil_matrix(var[n * A + (n**2 + m**2 + m*n):n*A + (n**2 + m**2 + m*n) +n])
    # this might not be efficient, but save for now
    return U.toarray(), Q.toarray(), M.toarray(), optval
Beispiel #2
0
import numpy as np
from cvxopt import spmatrix, matrix, solvers, glpk
from scipy import sparse
import cvxtool


c = sparse.lil_matrix(np.ones((3,1)))
c = matrix(c.toarray())

Aineq = sparse.lil_matrix(-1 * np.eye(3))
Aineq = cvxtool.scipy_sparse_to_spmatrix(Aineq.tocoo())

bineq = np.zeros((3,1))
bineq[0,0] = 1
bineq[1,0] = 2
bineq[2,0] = 3
bineq = matrix(bineq)

Aeq = sparse.lil_matrix(np.ones((1,3)))
Aeq = cvxtool.scipy_sparse_to_spmatrix(Aeq.tocoo())

beq = np.zeros((1,1))
beq[0,0] = -6
beq = matrix(beq)

sol = solvers.lp(c, Aineq, bineq, Aeq, beq, solver = 'glpk')
print(sol['x'])
print(sol['primal objective'])
def policy(g, rt, L, d, x, u_next, u_ref, opt_ref,  gamma):
    # add a small constant to resolve numerical issue
    opt_ref += 10e-5
    [m,temp]=d.shape
    [A, temp, n]=g.shape

    # GG=np.zeros((n*n,n*A))
    GG = sparse.lil_matrix((n * n,n * A))
    
    for i in range(n):
        for j in range(n):
            temp_g=np.zeros((1,A))
            for k in range(A):
                temp_g[:,[k]]=g[k,i,j]

            GG[i*n+j,j*A:j*A+A]=temp_g


    #FF=np.zeros((n*n,n*n))
    FF=sparse.lil_matrix((n*n,n*n))

    for i in range(n):
        for j in range(n):
           FF[i*n+j,j*n+i]=1

    # RR=np.zeros((n,n*A))
    RR= sparse.lil_matrix((n,n*A))

    for i in range(n):
        RR[i,i*A:i*A+A]=rt[i,:]

    # LL1=np.zeros((m*n,n*n))
    LL1 = sparse.lil_matrix((m*n,n*n))
    for i in range(n):
        LL1[i*m:i*m+m,i*n:i*n+n]=L

    # LL2=np.zeros((m*n,m*m))
    LL2 = sparse.lil_matrix((m*n,m*m))
    for i in range(n):
        for j in range(m):
            LL2[i*m:i*m+m,j*m:j*m+m]=L[j,i]*np.eye(m)

    # EE=np.zeros((m*n,m))
    EE = sparse.lil_matrix((m*n,m))
    for i in range(n):
        EE[i*m:i*m+m,:]= np.eye(m)

    # UU=np.zeros((n,n*n))
    UU = sparse.lil_matrix((n,n*n))
    for i in range(n):
        UU[i,i*n:i*n+n]=gamma*u_next

    # OO=np.zeros((n,n*A))
    OO = sparse.lil_matrix((n,n*A))
    
    for i in range(n):
        OO[i,i*A:i*A+A]=np.ones((1,A))

    # DD=np.zeros((m,m*m))
    DD = sparse.lil_matrix((m,m*m))
    for i in range(m):
        DD[:,i*m:i*m+m]=d[i]*np.eye(m)

#    e_n= np.eye(n)
#    e_m=np.eye(m)
#    e_mn=np.eye(m*n)
#    e_mm= np.eye(m*m)
#    e_nA= np.eye(n*A)

    e_n= sparse.eye(n)
    e_m=sparse.eye(m)
    e_mn=sparse.eye(m*n)
    e_mm= sparse.eye(m*m)
    e_nA= sparse.eye(n*A)

#    z_1_1= np.zeros((1,1))
#    z_1_m= np.zeros((1,m))
#    z_1_n= np.zeros((1,n))
#    z_1_mm= np.zeros((1,m*m))
#    z_1_nn= np.zeros((1,n*n))
#    z_1_mn= np.zeros((1,m*n))
#    z_1_nA= np.zeros((1,n*A))
#
#
#    z_m_1= np.zeros((m,1))
#    z_m_m= np.zeros((m,m))
#    z_m_n= np.zeros((m,n))
#    z_m_mm= np.zeros((m,m*m))
#    z_m_nn= np.zeros((m,n*n))
#    z_m_mn= np.zeros((m,m*n))
#    z_m_nA= np.zeros((m,n*A))
#
#    z_n_1= np.zeros((n,1))
#    z_n_m= np.zeros((n,m))
#    z_n_n= np.zeros((n,n))
#    z_n_mm= np.zeros((n,m*m))
#    z_n_nn= np.zeros((n,n*n))
#    z_n_mn= np.zeros((n,m*n))
#    z_n_nA= np.zeros((n,n*A))
#
#    z_mm_1= np.zeros((m*m,1))
#    z_mm_m= np.zeros((m*m,m))
#    z_mm_n= np.zeros((m*m,n))
#    z_mm_mm= np.zeros((m*m,m*m))
#    z_mm_nn= np.zeros((m*m,n*n))
#    z_mm_mn= np.zeros((m*m,m*n))
#    z_mm_nA= np.zeros((m*m,n*A))
#
#    z_nn_1= np.zeros((n*n,1))
#    z_nn_m= np.zeros((n*n,m))
#    z_nn_n= np.zeros((n*n,n))
#    z_nn_mm= np.zeros((n*n,m*m))
#    z_nn_nn= np.zeros((n*n,n*n))
#    z_nn_mn= np.zeros((n*n,m*n))
#    z_nn_nA= np.zeros((n*n,n*A))
#
#    z_mn_1= np.zeros((m*n,1))
#    z_mn_m= np.zeros((m*n,m))
#    z_mn_n= np.zeros((m*n,n))
#    z_mn_mm= np.zeros((m*n,m*m))
#    z_mn_nn= np.zeros((m*n,n*n))
#    z_mn_mn= np.zeros((m*n,m*n))
#    z_mn_nA= np.zeros((m*n,n*A))
#
#    z_nA_1= np.zeros((n*A,1))
#    z_nA_m= np.zeros((n*A,m))
#    z_nA_n= np.zeros((n*A,n))
#    z_nA_mm= np.zeros((n*A,m*m))
#    z_nA_nn= np.zeros((n*A,n*n))
#    z_nA_mn= np.zeros((n*A,m*n))
#    z_nA_nA= np.zeros((n*A,n*A))

    z_1_1= sparse.lil_matrix((1,1))
    z_1_m= sparse.lil_matrix((1,m))
    z_1_n= sparse.lil_matrix((1,n))
    z_1_mm= sparse.lil_matrix((1,m*m))
    z_1_nn= sparse.lil_matrix((1,n*n))
    z_1_mn= sparse.lil_matrix((1,m*n))
    z_1_nA= sparse.lil_matrix((1,n*A))


    z_m_1= sparse.lil_matrix((m,1))
    z_m_m= sparse.lil_matrix((m,m))
    z_m_n= sparse.lil_matrix((m,n))
    z_m_mm= sparse.lil_matrix((m,m*m))
    z_m_nn= sparse.lil_matrix((m,n*n))
    z_m_mn= sparse.lil_matrix((m,m*n))
    z_m_nA= sparse.lil_matrix((m,n*A))

    z_n_1= sparse.lil_matrix((n,1))
    z_n_m= sparse.lil_matrix((n,m))
    z_n_n= sparse.lil_matrix((n,n))
    z_n_mm= sparse.lil_matrix((n,m*m))
    z_n_nn= sparse.lil_matrix((n,n*n))
    z_n_mn= sparse.lil_matrix((n,m*n))
    z_n_nA= sparse.lil_matrix((n,n*A))

    z_mm_1= sparse.lil_matrix((m*m,1))
    z_mm_m= sparse.lil_matrix((m*m,m))
    z_mm_n= sparse.lil_matrix((m*m,n))
    z_mm_mm= sparse.lil_matrix((m*m,m*m))
    z_mm_nn= sparse.lil_matrix((m*m,n*n))
    z_mm_mn= sparse.lil_matrix((m*m,m*n))
    z_mm_nA= sparse.lil_matrix((m*m,n*A))

    z_nn_1= sparse.lil_matrix((n*n,1))
    z_nn_m= sparse.lil_matrix((n*n,m))
    z_nn_n= sparse.lil_matrix((n*n,n))
    z_nn_mm= sparse.lil_matrix((n*n,m*m))
    z_nn_nn= sparse.lil_matrix((n*n,n*n))
    z_nn_mn= sparse.lil_matrix((n*n,m*n))
    z_nn_nA= sparse.lil_matrix((n*n,n*A))

    z_mn_1= sparse.lil_matrix((m*n,1))
    z_mn_m= sparse.lil_matrix((m*n,m))
    z_mn_n= sparse.lil_matrix((m*n,n))
    z_mn_mm= sparse.lil_matrix((m*n,m*m))
    z_mn_nn= sparse.lil_matrix((m*n,n*n))
    z_mn_mn= sparse.lil_matrix((m*n,m*n))
    z_mn_nA= sparse.lil_matrix((m*n,n*A))

    z_nA_1= sparse.lil_matrix((n*A,1))
    z_nA_m= sparse.lil_matrix((n*A,m))
    z_nA_n= sparse.lil_matrix((n*A,n))
    z_nA_mm= sparse.lil_matrix((n*A,m*m))
    z_nA_nn= sparse.lil_matrix((n*A,n*n))
    z_nA_mn= sparse.lil_matrix((n*A,m*n))
    z_nA_nA= sparse.lil_matrix((n*A,n*A))

#    Aeq_r1= np.concatenate((GG,           -FF,          z_nn_mn,     z_nn_mm,     z_nn_n,     z_nn_m,     z_nn_n,      z_nn_m,     z_nn_1), axis=1)
#    Aeq_r2= np.concatenate((RR,           z_n_nn,       z_n_mn,      z_n_mm,      z_n_n,      z_n_m,      -e_n,        z_n_m,      z_n_1), axis=1)
#    Aeq_r3= np.concatenate((z_n_nA,       UU,           z_n_mn,      z_n_mm,      -e_n,       z_n_m,      e_n,         z_n_m,      z_n_1), axis=1)
#    Aeq_r4= np.concatenate((z_mn_nA,      LL1,          e_mn,        -LL2,        z_mn_n,     z_mn_m,     z_mn_n,      EE,         z_mn_1), axis=1)
#    Aeq_r5= np.concatenate((OO,           z_n_nn,       z_n_mn,      z_n_mm,      z_n_n,      z_n_m,      z_n_n,       z_n_m,      z_n_1), axis=1)
#
#    Aeq= np.concatenate((Aeq_r1, Aeq_r2, Aeq_r3, Aeq_r4, Aeq_r5), axis=0)
#    beq= np.concatenate((z_nn_1,   z_n_1,   z_n_1,   z_mn_1,   np.ones((n,1))), axis=0)
#
#    Aineq_r1= np.concatenate((z_m_nA,     z_m_nn,       z_m_mn,      DD,          z_m_n,      z_m_m,      z_m_n,       -e_m,       z_m_1), axis=1)
#    Aineq_r2= np.concatenate((z_n_nA,     z_n_nn,       z_n_mn,      z_n_mm,      z_n_n,      -L.T,       z_n_n,       z_n_m,      np.ones((n,1))), axis=1)
#    Aineq_r3= np.concatenate((-e_nA,      z_nA_nn,      z_nA_mn,     z_nA_mm,     z_nA_n,     z_nA_m,     z_nA_n,      z_nA_m,     z_nA_1), axis=1)
#    Aineq_r4= np.concatenate((z_mn_nA,    z_mn_nn,      -e_mn,       z_mn_mm,     z_mn_n,     z_mn_m,     z_mn_n,      z_mn_m,     z_mn_1), axis=1)
#    Aineq_r5= np.concatenate((z_mm_nA,    z_mm_nn,      z_mm_mn,     -e_mm,       z_mm_n,     z_mm_m,     z_mm_n,      z_mm_m,     z_mm_1), axis=1)
#    Aineq_r6= np.concatenate((z_m_nA,     z_m_nn,       z_m_mn,      z_m_mm,      z_m_n,      -e_m,       z_m_n,       z_m_m,      z_m_1), axis=1)
#    Aineq_r7=np.concatenate((z_1_nA,      z_1_nn,       z_1_mn,      z_1_mm,      z_1_n,      d.reshape(1,m),      z_1_n,      z_1_m,        -np.ones((1,1))), axis=1)
#
#    c= np.concatenate((z_nA_1,       z_nn_1,      z_mn_1,     z_mm_1,     -x,     z_m_1,        z_n_1,      z_m_1,      -np.zeros((1,1))), axis=0)
#    opt=np.zeros([1,1])
#    opt[0,0]=opt_ref
#    Aineq= np.concatenate((Aineq_r1, Aineq_r2, Aineq_r3, Aineq_r4, Aineq_r5, Aineq_r6, Aineq_r7), axis=0)
#    bineq= np.concatenate((d,        u_ref.reshape(n,1),     z_nA_1,     z_mn_1,     z_mm_1,     z_m_1,  opt), axis=0)

    Aeq_r1= sparse.hstack([GG,           -FF,          z_nn_mn,     z_nn_mm,     z_nn_n,     z_nn_m,     z_nn_n,      z_nn_m,     z_nn_1])
    Aeq_r2= sparse.hstack([RR,           z_n_nn,       z_n_mn,      z_n_mm,      z_n_n,      z_n_m,      -e_n,        z_n_m,      z_n_1])
    Aeq_r3= sparse.hstack([z_n_nA,       UU,           z_n_mn,      z_n_mm,      -e_n,       z_n_m,      e_n,         z_n_m,      z_n_1])
    Aeq_r4= sparse.hstack([z_mn_nA,      LL1,          e_mn,        -LL2,        z_mn_n,     z_mn_m,     z_mn_n,      EE,         z_mn_1])
    Aeq_r5= sparse.hstack([OO,           z_n_nn,       z_n_mn,      z_n_mm,      z_n_n,      z_n_m,      z_n_n,       z_n_m,      z_n_1])

    Aeq= sparse.vstack([Aeq_r1, Aeq_r2, Aeq_r3, Aeq_r4, Aeq_r5])
    beq= sparse.vstack([z_nn_1,   z_n_1,   z_n_1,   z_mn_1,   np.ones((n,1))])

    Aineq_r1= sparse.hstack([z_m_nA,     z_m_nn,       z_m_mn,      DD,          z_m_n,      z_m_m,      z_m_n,       -e_m,       z_m_1])
    Aineq_r2= sparse.hstack([z_n_nA,     z_n_nn,       z_n_mn,      z_n_mm,      z_n_n,      -L.T,       z_n_n,       z_n_m,      np.ones((n,1))])
    Aineq_r3= sparse.hstack([-e_nA,      z_nA_nn,      z_nA_mn,     z_nA_mm,     z_nA_n,     z_nA_m,     z_nA_n,      z_nA_m,     z_nA_1])
    Aineq_r4= sparse.hstack([z_mn_nA,    z_mn_nn,      -e_mn,       z_mn_mm,     z_mn_n,     z_mn_m,     z_mn_n,      z_mn_m,     z_mn_1])
    Aineq_r5= sparse.hstack([z_mm_nA,    z_mm_nn,      z_mm_mn,     -e_mm,       z_mm_n,     z_mm_m,     z_mm_n,      z_mm_m,     z_mm_1])
    Aineq_r6= sparse.hstack([z_m_nA,     z_m_nn,       z_m_mn,      z_m_mm,      z_m_n,      -e_m,       z_m_n,       z_m_m,      z_m_1])
    Aineq_r7=sparse.hstack([z_1_nA,      z_1_nn,       z_1_mn,      z_1_mm,      z_1_n,      d.reshape(1,m),      z_1_n,      z_1_m,        -np.ones((1,1))])

    c= sparse.vstack([z_nA_1,       z_nn_1,      z_mn_1,     z_mm_1,     -x,     z_m_1,        z_n_1,      z_m_1,      -np.zeros((1,1))])

    opt=np.zeros([1,1])
    opt[0,0]=opt_ref

    Aineq= sparse.vstack([Aineq_r1, Aineq_r2, Aineq_r3, Aineq_r4, Aineq_r5, Aineq_r6, Aineq_r7])
    bineq= sparse.vstack([d,        u_ref.reshape(n,1),     z_nA_1,     z_mn_1,     z_mm_1,     z_m_1,  opt])

#    Aeq= matrix(Aeq)
#    beq= matrix(beq)
#    Aineq= matrix(Aineq)
#    bineq= matrix(bineq)
#    c= matrix(c)

    # note: toarray() might not be efficient
    Aeq = cvxtool.scipy_sparse_to_spmatrix(Aeq.tocoo()) 
#    Aeq = matrix(Aeq.toarray()) 
    beq = matrix(beq.toarray())
    Aineq = cvxtool.scipy_sparse_to_spmatrix(Aineq.tocoo())
#    Aineq = matrix(Aineq.toarray()) 
    bineq = matrix(bineq.toarray())
    c = matrix(c.toarray()) 

    # call solver
    sol= solvers.lp(c,Aineq,bineq,Aeq,beq, solver = 'glpk')
#    var = np.array(sol['x'])
#    temp_q=var[0:n*A,:]
#    Q=temp_q.reshape(n,A)
#    print("Solution:", sol)
    var = sparse.lil_matrix(sol['x'])
    temp_q = sparse.lil_matrix(var[0:n*A,:])
    Q = temp_q.reshape((n,A))

    # M = np.zeros((n,n))
    M = sparse.lil_matrix((n,n))
    for i in range(n):
        for j in range(n):
            for k in range(A):
                M[i,j]=M[i,j]+g[k,i,j]*Q[j,k]

    # U = var[n * A + (n**2 + m**2 + m*n):n*A + (n**2 + m**2 + m*n) +n]
    U = sparse.lil_matrix(var[n * A + (n**2 + m**2 + m*n):n*A + (n**2 + m**2 + m*n) +n])
    # toarray not efficient
    return U.toarray(), Q.toarray(), M.toarray()