In [6]:
from numpy import *
from scipy import *

In [7]:
T0 = 10000
T1 = 30000
random.seed(31415)

In [76]:
# L layer
N = 50
L = 2
alpha = 0.01
maxSVD_recur = 0.95
maxSVD_inter = 0.5
#taus = [0.01, 0.01, 0.8, 0.8]
taus = [0.8, 0.8]

In [77]:
def activate_function(x):
#    return x
    return tanh(x)
#    return x if x>0 else 0

In [78]:
# generate weight matrix
V = zeros((L, N, N), dtype=float)
for l in range(L):
    for i in range(N):
        for j in range(N):
            V[l, i,j] = random.uniform(-1, 1) if random.uniform(0, 1)<0.3 else 0
    u,s,v = linalg.svd(V[l,:,:])
    for i in range(N):
        for j in range(N):
            V[l,i,j] *= maxSVD_recur/s[0]
#    u,s,v = linalg.svd(V[l,:,:])
#    print s

U = zeros(N, dtype=float)
for i in range(N):
    U[i] = random.uniform(-1, 1)/sqrt(N)

    
W = zeros((L, N, N), dtype=float)
for l in range(L):
    for i in range(N):
        for j in range(N):
            W[l,i,j] = random.uniform(-1, 1) if random.uniform(0, 1)<0.3 else 0
    u,s,v = linalg.svd(W[l,:,:])
    for i in range(N):
        for j in range(N):
            W[l,i,j] *= maxSVD_inter/s[0]
#    u,s,v = linalg.svd(W[l,:,:])
#    print s

In [79]:
# generate output sequence
vfunc = vectorize(activate_function, otypes=[float])
x = zeros((L,N), dtype=float)
xx = zeros((L, T0+T1, N), dtype=float)
a = loadtxt("input.txt")
for l in range(L):
    for i in range(N):
        x[l,i] = random.uniform(-1, 1)
for i in range(T0+T1):
    nx = dot(V[0], x[0]) + dot(W[0].T, x[1]) + alpha*dot(U, a[i])
    x[0] = taus[0]*x[0] + (1.0-taus[0])*vfunc(nx)
    for l in range(1,L-1):
        nx = dot(V[l], x[l]) + dot(W[l-1], x[l-1]) + dot(W[l].T, x[l+1])
        x[l] = taus[l]*x[l] + (1.0-taus[l])*vfunc(nx)
    nx = dot(V[L-1], x[L-1]) + dot(W[L-2], x[L-2])
    x[L-1] = taus[L-1]*x[L-1] + (1.0-taus[L-1])*vfunc(nx)
    
    for l in range(L):
        xx[l,i,:] = x[l,:]

In [80]:
for i in range(L):
    savetxt("output_ml_"+str(i)+".txt", xx[i])

In [ ]: