In [1]:
### From Burak and Fiete, Plos Comp. Biol. 2009
### Author: Harsha Gurnani

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

In [ ]:


In [3]:
### Setting up model

nsedge = 128
NN = nsedge**2        #no. of neurons

posx = [ int(nn/nsedge)-nsedge/2 for nn in range(NN) ]
posy = [ int(mod(nn,nsedge))-nsedge/2 for nn in range(NN) ]

pref_dirn = [0 for ii in range(NN)]

dirns = [[0,1], [1,0],[0,-1], [-1,0]]
for ii in range(NN):
    shift=int(mod(mod(ii,8),4))
    ind= mod(shift+ int(mod(ii,4)),4)
    pref_dirn[ii] = ind
    
tau=10/1000
dt =0.5/1000

In [ ]:
### Weight matrix
def get_baselineW(a, gamma, beta, dist2):
    return a*exp(-gamma*dist2) - exp(-beta*dist2)

lambda_net=13
a = 1.0
beta =3/(lambda_net**2)
gamma = 1.05*beta
l = 0.5

vec=zeros(2)
Wt = zeros([NN,NN])
for ii in range(NN):
    for jj in range(NN):
        x1,y1=posx[ii],posy[ii]
        x2,y2=posx[jj],posy[jj]
        pf=dirns[pref_dirn[jj]]
        vec[0] = x1 - x2 - l*pf[0]
        vec[1] = y1 - y2 -l*pf[1]
        dist2 = vec[0]**2 + vec[1]**2
        W = get_baselineW(a,gamma,beta,dist2)
        Wt[ii,jj] = W

In [ ]:
### Velocity-modulated inputs

B = zeros(NN)
def get_vel_input(NN,A,alpha,edir,vel):
    bv = zeros(NN)
    for ii in range(NN):
        pf = dirns[edir[ii]]
        comp = pf[0]*vel[0] + pf[1]*vel[1]
        bv[ii] = A[ii]*(1+alpha*comp)
    return bv

In [ ]:
A = [1 for ii in range(NN)]
alpha=0.10315

In [ ]:
def DiffEqnForRates( s, t, Wt, tau , vel) :
    '''
    eqns for ds/dt
    s: Firing rates of all neurons
    Wt : synaptic weight matrix
    B : Velocity-modulated input
    '''
    Ns= len(s)
    n = int(sqrt(Ns))
    dsdt = zeros(Ns)
    B = get_vel_input(Ns, A, alpha, pref_dirn, vel[t])
    for ii in range(Ns):
        syn_act = B[ii]
        for jj in range(Ns):
            syn_act += Wt[jj,ii]*s[jj]
        if syn_act < 0:
            syn_act = 0;
        dsdt[ii] = (syn_act - s[ii])/tau
        
    return dsdt

In [ ]:
### Setting up simulations
dt =0.5/1000
t=10
trange=range(int(t/dt))

vel=[(rand(2)-0.5)*0.8 for ii in trange]
init_t=int(0.25/dt)
for ii in range(init_t):
    vel[ii] = [1,0]*0.8
for ii in range(init_t, 2*init_t):
    vel[ii] = [cos(pi/5), sin(pi/5)]*0.8
for ii in range(2*init_t,3*init_t):
    vel[ii] = [cos(pi/2-pi/5), sin(pi/2-pi/5)]*0.8

print shape(vel)

s0 = rand(NN)*5
rates = scipy.integrate.odeint(DiffEqnForRates, s0, t, Wt, tau, vel)
print shape(rates)

In [ ]:
### Get position from velocity
### Plot rates versus position
### Plot population response maps

In [ ]: