Sensorimotor cortex reinforcement learning of 2-joint virtual arm reaching (Neymotin et al. 2013)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:150245
"... We developed a model of sensory and motor neocortex consisting of 704 spiking model-neurons. Sensory and motor populations included excitatory cells and two types of interneurons. Neurons were interconnected with AMPA/NMDA, and GABAA synapses. We trained our model using spike-timing-dependent reinforcement learning to control a 2-joint virtual arm to reach to a fixed target. ... "
Reference:
1 . Neymotin SA, Chadderdon GL, Kerr CC, Francis JT, Lytton WW (2013) Reinforcement learning of two-joint virtual arm reaching in a computer model of sensorimotor cortex. Neural Comput 25:3263-93 [PubMed]
Citations  Citation Browser
Model Information (Click on a link to find other models with that property)
Model Type: Realistic Network;
Brain Region(s)/Organism:
Cell Type(s): Neocortex L5/6 pyramidal GLU cell; Neocortex U1 L2/6 pyramidal intratelencephalic GLU cell; Neocortex V1 interneuron basket PV GABA cell; Neocortex fast spiking (FS) interneuron; Neocortex spiking regular (RS) neuron; Neocortex spiking low threshold (LTS) neuron;
Channel(s):
Gap Junctions:
Receptor(s): GabaA; AMPA; NMDA;
Gene(s):
Transmitter(s): Gaba; Glutamate;
Simulation Environment: NEURON;
Model Concept(s): Synaptic Plasticity; Learning; Reinforcement Learning; STDP; Reward-modulated STDP; Sensory processing;
Implementer(s): Neymotin, Sam [Samuel.Neymotin at nki.rfmh.org]; Chadderdon, George [gchadder3 at gmail.com];
Search NeuronDB for information about:  Neocortex L5/6 pyramidal GLU cell; Neocortex V1 interneuron basket PV GABA cell; Neocortex U1 L2/6 pyramidal intratelencephalic GLU cell; GabaA; AMPA; NMDA; Gaba; Glutamate;
/
a2dmodeldb
readme.html
drspk.mod *
infot.mod *
intf6_.mod *
misc.mod *
nstim.mod *
stats.mod *
vecst.mod *
arm.hoc
basestdp.hoc
col.hoc
colors.hoc *
declist.hoc *
decmat.hoc *
decnqs.hoc *
decvec.hoc *
default.hoc *
drline.hoc *
filtutils.hoc *
geom.hoc
grvec.hoc *
hinton.hoc *
infot.hoc *
init.hoc
labels.hoc *
misc.h *
mosinit.hoc
network.hoc
nload.hoc
nqs.hoc *
nqsnet.hoc *
nrnoc.hoc *
params.hoc
python.hoc
pywrap.hoc *
run.hoc
samutils.hoc *
screenshot.png
sense.hoc *
setup.hoc *
simctrl.hoc *
stats.hoc *
stim.hoc
syncode.hoc *
trainedplast.nqs
units.hoc *
xgetargs.hoc *
                            
// $Id: sense.hoc,v 1.21 2011/11/22 22:55:23 samn Exp $ 

//* proprioceptive inputs
declare("stimnq","o[1]","DPseed",9658,"DPdt",1,"ldp","o[1]","minDPr",0,"maxDPr",1)

rdmthresh_DRSPK = 1

//* mkstimnq([seed]) - make NQS with inputs to DP(proprioceptive) cells
proc mkstimnq () { local ii,se,a localobj xo,rdm,ind,vr
  if(numarg()>0) se=$1 else se=9658
  {nqsdel(stimnq) stimnq=new NQS("eflex","eext","wflex","wext")}
  rdm=new Random() rdm.ACG(se) a=allocvecs(ind,vr)
  ind.indgen(0,PI/2,0.01)
  for ii=0,10 {stimnq.v[0].append(ind) stimnq.v[0].append(ind.c.reverse)}
  stimnq.v[1].copy(stimnq.v[0])
  ind.indgen(PI/4,3*PI/4,0.01) // recording at 1e-3 but play back at 0.3
  for ii=0,10 {stimnq.v[2].append(ind) stimnq.v[2].append(ind.c.reverse)}
  stimnq.v[3].copy(stimnq.v[2])
  for case(&ii,0,2) stimnq.v(ii).apply("sin")
  for case(&ii,1,3) stimnq.v(ii).apply("cos")
  for ii=0,2 stimnq.v(ii).scale(0.1,0.5)
  for ltr(xo,cedp) stimnq.v[xo.zloc].play(&xo.drive, 0.6)
  rdm.poisson(8)
  vr.resize(tstop)
  for ltr(xo,cedp,&ii) {
    vr.setrand(rdm)
    vr.scale(minDPr,maxDPr)
    vr.play(&xo.rand, 0.6)
  }
  dealloc(a)
}

//* setDPrand - set random thresholds for DP cells
proc setDPrand () { local ii,se,a localobj xo,rdm,vr,vec
  if(numarg()>0) se=$1 else se=9658
  if(rdmthresh_DRSPK) {
    ldp=new List() rdm=new Random() rdm.ACG(se) rdm.poisson(8)
  } else {rdm=new Random() rdm.ACG(se)}
  for ltr(xo,cedp,&ii) {
   if(rdmthresh_DRSPK) {
     rdm.normal(25,10)
     ldp.append(vr=new Vector(tstop / DPdt + 1))
     vr.setrand(rdm)
//     vr.scale(minDPr,maxDPr)
     vr.scale(1.5,50)
     vr.play(&xo.drspk.rand,DPdt)
   } else {
     xo.drspk.thresh = xo.drspk.rand = rdm.uniform(minDPr,maxDPr)
   }
  }
}

//* func calls

setDPrand(DPseed)