示例#1
0
    def create(self, setname, pos=None, thresh=-1000000):
        #  time series to model ratio of the states
        oo  = self
        k   = oo.k
        N   = oo.N   #  length of observation
        M   = oo.M   #  # of cells

        oo.uP   = _N.empty((M, N))     #  
        oo.stdP = _N.empty((M, N))     #  
        
        oo.um   = _N.empty((M, N, k))     #  
        oo.Cov = _N.empty((M, k, k))
        oo.neurIDs= _N.zeros((N, M), dtype=_N.int)
        #oo.neurIDsf= _N.empty((N, M))
        oo.dt  = 0.001
        if oo.stdPMags is None:
            oo.stdPMags = _N.ones(M)*0.1

        oo.alp = _N.empty((M, N))

        mr  = _N.random.rand(N)

        if oo.bWtrack:
            oo.pos = _U.generateMvt(N, vAmp=oo.vAmp, constV=oo.constV, pLR=oo.pLR, nLf=oo.nLf, nRh=oo.nRh)

        else:
            oo._pos   = _N.empty(N)
            oo.pos   = _N.empty(N)
            oo._pos[0] = 0.3*_N.random.randn()
            for n in xrange(N-1):
                oo._pos[n+1] = 0.9995*oo._pos[n] + 0.04*_N.random.randn()
            oo.pos[:] = oo._pos[:]#_N.convolve(oo._pos, gk, mode="same")
        oo.mvpos = oo.pos
            
        Ns = N/50
        _ts   = _N.linspace(0, N, Ns, endpoint=False)
        ts    = _N.linspace(0, N, N, endpoint=False)

        #  First generate 
        #  step update is 50ms.  

        #gk = gauKer(2)
        #gk /= _N.sum(gk)
        
        #oo.pos[:] = _N.interp(ts, _ts, oo._pos)

        Ns = N/1000
        _ts   = _N.linspace(0, N, Ns, endpoint=False)

        oo._uP   = _N.empty((M, Ns))     #  
        oo._um   = _N.empty((M, Ns, oo.k))     #  
        oo._stdP = _N.empty((M, Ns))     #  
        oo._alp  = _N.empty((M, Ns))     #  

        #########  Initial conditions
        if oo.uP0 is not None:   #  M x Npf  matrix
            oo._uP[:, 0]  = 0
        else:
            oo._uP[:, 0]  = _N.random.randn(M)

        if oo.alp0 is not None:  #  M x Npf  matrix
            oo._alp[:, 0] =   oo.alp0
        else:
            oo._alp[:, 0] = _N.random.randn(M)

        if oo.um0 is not None:  #  M x k  matrix
            oo._um[:, 0, :] =   0
        else:
            oo._um[:, 0]   = _N.random.randn(oo.k)*oo.md   

        ######  BUILD latent place field centers and mark centers
        for m in xrange(M):
            for ik in xrange(k):
                oo.Cov[m, ik, ik] = oo.min_var + (oo.max_var - oo.min_var)*_N.random.rand()
            for ik1 in xrange(k):
                for ik2 in xrange(ik1 + 1, k):        #  set up cov. matrices
                    oo.Cov[m, ik1, ik2] = 0.4*(0.6+0.4*_N.abs(_N.random.rand()))*_N.sqrt(oo.Cov[m, ik1, ik1]*oo.Cov[m, ik2, ik2])
                    oo.Cov[m, ik2, ik1] = oo.Cov[m, ik1, ik2]

        oo._stdP[:, 0] = 0.1*_N.random.randn()
        for n in xrange(Ns-1):   # slow changes
            for m in xrange(M):
                for ik in xrange(k):
                    oo._um[m, n+1, ik] = oo.Fm*oo._um[m, n, ik] + oo.sivm*_N.random.randn()
                    oo._uP[m, n+1] = oo.Fu*oo._uP[m, n] + oo.sivu*_N.random.randn()
                    oo._stdP[m, n+1] = oo.Fstd*oo._stdP[m, n] + oo.sivs*_N.random.randn()
                    oo._alp[m, n+1] = oo.Falp*oo._alp[m, n] + oo.siva*_N.random.randn()

        oo._uP[:, :]  += oo.uP0.reshape((M, 1))
        oo._um[:, :, :]  += oo.um0.reshape((M, 1, k))
        for m in xrange(M):
            for ik in xrange(k):
                oo.um[m, :, ik]   = _N.interp(ts, _ts, oo._um[m, :, ik])
                oo.uP[m]   = _N.interp(ts, _ts, oo._uP[m])
                oo.stdP[m] = _N.interp(ts, _ts, _N.abs(oo._stdP[m])) + oo.stdPMags[m]
                oo.alp[m] = _N.log(_N.interp(ts, _ts, _N.abs(oo._alp[m])))

        ######  now create spikes
        oo.marksH     = _N.empty((oo.N, 1), dtype=list)
        oo.marksNH    = _N.empty((oo.N, 1), dtype=list)

        nspks = 0
        cut   = 0
        for m in xrange(M):#  For each cluster
            if m < oo.Mh_strt:
                marks = oo.marksNH
            else:
                marks = oo.marksH
            mkid = oo.markIDs[m]     #  for the mark
            fr          = _N.zeros(oo.N)
            wdP     = 2*oo.stdP[m]**2

            fr[:]   += _N.exp(oo.alp[m] - (oo.pos - oo.uP[m])**2 / wdP)

            rands = _N.random.rand(oo.N)
            thrX  = _N.where(rands < fr*oo.dt)[0]

            #oo.neurIDsf[:, m] = fr
            oo.neurIDs[thrX, m] = 1
            for n in xrange(len(thrX)):   # iterate over time
                tm = thrX[n]
                mk    = mvn(oo.um[mkid, tm], oo.Cov[mkid], size=1)[0]
                if (_N.sum(mk < thresh) == oo.k):
                    oo.neurIDs[thrX[n], m] = 0
                    cut += 1
                else:
                    if marks[tm, 0] is None:      #  separate hash, non-hash
                        marks[tm, 0] = [mk]
                    else:
                        marks[tm, 0].append(mk)

                    nspks += 1

        #kde = _kde.kde(setname)
        #oo.marks = None
        #kde.est(oo.pos, oo.marks, oo.k, oo.xA, oo.mA, oo.Nx, oo.Nm, oo.Bx, oo.Bm, oo.bx, t0=t0, t1=t1, filename="kde.dump")

        print "tot spikes created %(n)d   cut %(c)d" % {"n" : nspks, "c" : cut}
        dmp = open(_edd.resFN("marks.pkl", dir=setname, create=True), "wb")
        pickle.dump(oo, dmp, -1)
        dmp.close()
示例#2
0
    def create(self, setname, pos=None):
        #  time series to model ratio of the states
        oo = self
        k = oo.k
        N = oo.N  #  length of observation
        M = oo.M
        Npf = oo.Npf  #  number of place fields per neuron

        oo.uP = _N.empty((M, Npf, N))  #
        oo.stdP = _N.empty((M, Npf, N))  #

        oo.um = _N.empty((M, N, k))  #
        oo.Cov = _N.empty((M, k, k))
        oo.neurIDs = _N.zeros((N, M), dtype=_N.int)
        # oo.neurIDsf= _N.empty((N, M))
        oo.dt = 0.001
        if oo.stdPMags is None:
            oo.stdPMags = _N.ones(M * Npf) * 0.1

        oo.alp = _N.empty((M, Npf, N))

        mr = _N.random.rand(N)

        if oo.bWtrack:
            oo.pos = _U.generateMvt(N, vAmp=oo.vAmp, constV=oo.constV)

        else:
            oo._pos = _N.empty(N)
            oo.pos = _N.empty(N)
            oo._pos[0] = 0.3 * _N.random.randn()
            for n in xrange(N - 1):
                oo._pos[n + 1] = 0.9995 * oo._pos[n] + 0.04 * _N.random.randn()
            oo.pos[:] = oo._pos[:]  # _N.convolve(oo._pos, gk, mode="same")
        oo.mvpos = oo.pos

        Ns = N / 50
        _ts = _N.linspace(0, N, Ns, endpoint=False)
        ts = _N.linspace(0, N, N, endpoint=False)

        #  First generate
        #  step update is 50ms.

        # gk = gauKer(2)
        # gk /= _N.sum(gk)

        # oo.pos[:] = _N.interp(ts, _ts, oo._pos)

        Ns = N / 1000
        _ts = _N.linspace(0, N, Ns, endpoint=False)

        oo._uP = _N.empty((M, Npf, Ns))  #
        oo._um = _N.empty((M, Ns, oo.k))  #
        oo._stdP = _N.empty((M, Npf, Ns))  #
        oo._alp = _N.empty((M, Npf, Ns))  #
        oo._pfdst = _N.empty((M, Npf - 1, Ns))  #  distance between place flds

        #########  Initial conditions
        if oo.uP0 is not None:  #  M x Npf  matrix
            oo._uP[:, :, 0] = 0
        else:
            oo._uP[:, :, 0] = _N.random.randn(M, Npf)

        if oo.alp0 is not None:  #  M x Npf  matrix
            oo._alp[:, :, 0] = oo.alp0
        else:
            oo._alp[:, :, 0] = _N.random.randn(M, Npf)

        if oo.um0 is not None:  #  M x k  matrix
            oo._um[:, 0, :] = 0
        else:
            oo._um[:, 0] = _N.random.randn(oo.k) * oo.md

        ######  BUILD latent place field centers and mark centers
        for m in xrange(M):
            for ik in xrange(k):
                oo.Cov[m, ik, ik] = oo.min_var + (oo.max_var - oo.min_var) * _N.random.rand()
            for ik1 in xrange(k):
                for ik2 in xrange(ik1 + 1, k):  #  set up cov. matrices
                    oo.Cov[m, ik1, ik2] = 0.04 * (0.1 + _N.abs(_N.random.randn()))
                    oo.Cov[m, ik2, ik1] = oo.Cov[m, ik1, ik2]

            ##  place field set up
            for np in xrange(1, Npf):
                mlt = 1 if _N.random.rand() < 0.5 else -1
                oo._uP[m, np] = oo._uP[m, np - 1] - mlt * (1 + 0.3 * _N.random.rand())
        oo._stdP[:, :, 0] = 0.1 * _N.random.randn()
        for n in xrange(Ns - 1):  # slow changes
            for m in xrange(M):
                for ik in xrange(k):
                    oo._um[m, n + 1, ik] = oo.Fm * oo._um[m, n, ik] + oo.sivm * _N.random.randn()
                for mpf in xrange(Npf):
                    oo._uP[m, mpf, n + 1] = oo.Fu * oo._uP[m, mpf, n] + oo.sivu * _N.random.randn()
                    oo._stdP[m, mpf, n + 1] = oo.Fstd * oo._stdP[m, mpf, n] + oo.sivs * _N.random.randn()
                    oo._alp[m, mpf, n + 1] = oo.Falp * oo._alp[m, mpf, n] + oo.siva * _N.random.randn()

        oo._uP[:, :, :] += oo.uP0.reshape((M, Npf, 1))
        # oo._um[:, :, :]  += oo.um0.reshape((M, 1, 1))
        oo._um[:, :, :] += oo.um0.reshape((M, 1, k))
        for m in xrange(M):
            for ik in xrange(k):
                oo.um[m, :, ik] = _N.interp(ts, _ts, oo._um[m, :, ik])
            for mpf in xrange(Npf):
                oo.uP[m, mpf] = _N.interp(ts, _ts, oo._uP[m, mpf])
                oo.stdP[m, mpf] = _N.interp(ts, _ts, _N.abs(oo._stdP[m, mpf])) + oo.stdPMags[m, mpf]
                oo.alp[m, mpf] = _N.log(_N.interp(ts, _ts, _N.abs(oo._alp[m, mpf])))

        ######  now create spikes
        oo.marks = _N.empty((oo.N, 1), dtype=list)

        nspks = 0
        for m in xrange(M):  #  For each cluster
            fr = _N.zeros(oo.N)
            for mpf in xrange(Npf):
                wdP = 2 * oo.stdP[m, mpf] ** 2

                fr[:] += _N.exp(oo.alp[m, mpf] - (oo.pos - oo.uP[m, mpf]) ** 2 / wdP)

            rands = _N.random.rand(oo.N)
            thrX = _N.where(rands < fr * oo.dt)[0]

            # oo.neurIDsf[:, m] = fr
            oo.neurIDs[thrX, m] = 1
            for n in xrange(len(thrX)):  # iterate over time
                tm = thrX[n]
                mk = mvn(oo.um[m, tm], oo.Cov[m], size=1)[0]
                if oo.marks[tm, 0] is None:
                    oo.marks[tm, 0] = [mk]
                else:
                    oo.marks[tm, 0].append(mk)
                nspks += 1

        # kde = _kde.kde(setname)
        # oo.marks = None
        # kde.est(oo.pos, oo.marks, oo.k, oo.xA, oo.mA, oo.Nx, oo.Nm, oo.Bx, oo.Bm, oo.bx, t0=t0, t1=t1, filename="kde.dump")

        print "total spikes created %d" % nspks
        dmp = open(_edd.resFN("marks.pkl", dir=setname, create=True), "wb")
        pickle.dump(oo, dmp, -1)
        dmp.close()