Cortical model with reinforcement learning drives realistic virtual arm (Dura-Bernal et al 2015)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:183014
We developed a 3-layer sensorimotor cortical network of consisting of 704 spiking model-neurons, including excitatory, fast-spiking and low-threshold spiking interneurons. Neurons were interconnected with AMPA/NMDA, and GABAA synapses. We trained our model using spike-timing-dependent reinforcement learning to control a virtual musculoskeletal human arm, with realistic anatomical and biomechanical properties, to reach a target. Virtual arm position was used to simultaneously control a robot arm via a network interface.
References:
1 . Dura-Bernal S, Zhou X, Neymotin SA, Przekwas A, Francis JT, Lytton WW (2015) Cortical Spiking Network Interfaced with Virtual Musculoskeletal Arm and Robotic Arm. Front Neurorobot 9:13 [PubMed]
2 . Dura-Bernal S, Li K, Neymotin SA, Francis JT, Principe JC, Lytton WW (2016) Restoring behavior via inverse neurocontroller in a lesioned cortical spiking model driving a virtual arm. Front. Neurosci. Neuroprosthetics 10:28
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 M1 pyramidal pyramidal tract L5B cell; Neocortex M1 pyramidal intratelencephalic L2-5 cell; Neocortex M1 interneuron basket PV cell; Neocortex fast spiking (FS) interneuron; Neostriatum fast spiking 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; Python (web link to model);
Model Concept(s): Synaptic Plasticity; Learning; Reinforcement Learning; STDP; Reward-modulated STDP; Sensory processing; Motor control;
Implementer(s): Neymotin, Sam [samn at neurosim.downstate.edu]; Dura, Salvador [ salvadordura at gmail.com];
Search NeuronDB for information about:  Neocortex M1 pyramidal intratelencephalic L2-5 cell; Neocortex M1 pyramidal pyramidal tract L5B cell; Neocortex M1 interneuron basket PV cell; GabaA; AMPA; NMDA; Gaba; Glutamate;
/
arm2dms_modeldb
mod
msarm
stimdata
README.html
analyse_funcs.py
analysis.py
armGraphs.py
arminterface_pipe.py
basestdp.hoc
bicolormap.py
boxes.hoc *
bpf.h *
col.hoc
colors.hoc *
declist.hoc *
decmat.hoc *
decnqs.hoc *
decvec.hoc *
default.hoc *
drline.hoc *
filtutils.hoc *
grvec.hoc
hinton.hoc *
hocinterface.py
infot.hoc *
init.hoc
intfsw.hoc *
labels.hoc
load.hoc
load.py
local.hoc *
main.hoc
main_demo.hoc
main_neurostim.hoc
misc.h *
misc.py *
msarm.hoc
network.hoc
neuroplot.py *
neurostim.hoc
nload.hoc
nqs.hoc *
nqsnet.hoc *
nrnoc.hoc
params.hoc
perturb.hoc
python.hoc
pywrap.hoc *
run.hoc
runbatch_neurostim.py
runsim_neurostim
samutils.hoc *
saveoutput.hoc
saveoutput2.hoc
setup.hoc *
sim.hoc
sim.py
sim_demo.py
simctrl.hoc *
stats.hoc *
stim.hoc
syncode.hoc *
units.hoc *
vector.py
xgetargs.hoc *
                            
objref xo, cellsPerturbFile,synsPerturbFile, cellsPerturb, synsPerturb, vidx, vwgain,vplasttau,vplastinc,vplastmaxw   // Initialize things for mist stimuli


/////////////////////////////////////
/// CELL PERTURBATIONS

// Read in perturbations from file
strdef cellsPerturbName, synsPerturbName

cellsPerturbFile = new File()
cellsPerturb = new Vector()
sprint(cellsPerturbName,"stimdata/%s-cellsPerturbed.txt",filestem)
cellsPerturbFile.ropen(cellsPerturbName) // Open file for reading; generated by runpbsbatch_mist_20params.py

if (cellsPerturbFile.isopen()) {
	print "Creating cell perturbations..."
	while (!cellsPerturbFile.eof()) { // Read from the data file
		cellsPerturb.append(cellsPerturbFile.scanvar()) // Read cell
		}
	cellsPerturbFile.close() // Close the input file


	for i=0, cellsPerturb.size()-1 { // Loop through perturbed cells and kill
		print "killing cell: ",cellsPerturb.x[i]
	    col.ce.o(cellsPerturb.x[i]).flag("dead",1)
		}
}

/////////////////////////////////////
/// SYNAPSE PERTURBATIONS

synsPerturbFile = new File()
synsPerturb = new Vector()
sprint(synsPerturbName,"stimdata/%s-synsPerturbed.txt",filestem)
synsPerturbFile.ropen(synsPerturbName) // Open file for reading; generated by runpbsbatch_mist_20params.py

if (synsPerturbFile.isopen()) {
	print "Creating synapse perturbations..."
	// allocate vectors
	aloc=allocvecs(vidx,vwgain,vplasttau,vplastinc,vplastmaxw)

	while (!synsPerturbFile.eof()) { // Read from the data file
		synsPerturb.append(synsPerturbFile.scanvar()) // Read cell
		}
	synsPerturbFile.close() // Close the input file

	print "File name:", synsPerturbName
	print "Size:",synsPerturb.size()-1

	for i=0, synsPerturb.size()-1 { // Loop through perturbed synapses and kill
		// find pre and postsynaptic cells using connsnq
		pre = col.connsnq.getrow(synsPerturb.x[i]).x(0)
		post = col.connsnq.getrow(synsPerturb.x[i]).x(1)
		xo = col[0].ce.o(pre)

		print "synapse:",synsPerturb.x[i], "pre:", pre, " post:", post

		// set vector length based on number of postsynaptic connections
		vrsz(xo.getdvi(vidx),vwgain,vplasttau,vplastinc,vplastmaxw)

		// read wgains
		xo.getplast(vwgain,vplasttau,vplastinc,vplastmaxw)

		// scale synaptic weight gain
		vwgain.x(vidx.indwhere("==",post)) = 0.0

		// update scaled wgains
		xo.setplast(vwgain,vplasttau,vplastinc,vplastmaxw)
		}
	dealloc(aloc)
}


Loading data, please wait...