//////////////////////////////
// Convergent connections
//////////////////////////////
function make_connection (source, dest)
//echo adding synapse addmsg {source} {dest} SPIKE
addmsg {source} {dest} SPIKE
end
function conv_cell (source, dest, spikesource, syndest, conv, is_recurrent, allow_repeats, random_dest, dest_num, num_source)
int i, j, r, t
int N_syndest
str selected_syndest
// Set up convergence table
create table /syntable
call /syntable TABCREATE {{conv}-1} 0 1 // Creates a table with conv entries
for (i=0; i<{conv}; i=i+1)
setfield /syntable table->table[{i}] 0
end
j=0
t=1
while (j < conv)
r = {rand 0 {num_source + 0.9 - 1}} // Random number between 0 and "num_source - 1"
// echo Proposed connection: source->{r} dest->{dest_num}
if (is_recurrent)
if (r == dest_num)
t=0 //if is recurrent network, don't want neuron k to synapse onto itself
// echo Self synapse! Skipping
end
end
if ({!allow_repeats})
for (i=0; i<{j}; i=i+1)
if({getfield /syntable table->table[{i}]} == r) // Check to see if the value is already taken
t=0 // if it's already taken, don't add to list
// echo Already taken! Skipping
end
end
end
if (t == 1)
setfield /syntable table->table[{j}] {r} // If all is well, add synapse to the list
j = j+1
// echo All's well, adding
end
t = 1
end
for (i=0;i<{conv};i=i+1)
N_syndest = {getarg {arglist {syndest}} -count}
if (random_dest)
r = {rand 1 {N_syndest + 0.9}} // Random number between 1 and "N_syndest"
selected_syndest = {getarg {arglist {syndest}} -arg {r}}
echo selected_syndest = {getarg {arglist {syndest}} -arg {r}}
make_connection {source}[{getfield /syntable table->table[{i}]}]/{spikesource} {dest}[{dest_num}]/{selected_syndest}
else
for (j=1;j<={N_syndest};j=j+1)
selected_syndest = {getarg {arglist {syndest}} -arg {j}}
make_connection {source}[{getfield /syntable table->table[{i}]}]/{spikesource} {dest}[{dest_num}]/{selected_syndest}
end
end
end
delete /syntable
end
function conv_connect (source, dest, spikesource, syndest, conv, is_recurrent, allow_repeats, random_dest)
// is_recurrent - if 1, network is recurrent (i.e. pyr2pyr) and therefore a synapse from neuron X -> neuron Y is only allowed if X≠Y
// allow_repeats - if 1, neuron X can synapse to neuron Y more than once. Useful for smaller networks
// random_dest - if 1, syndest is an argument list, likely containing multiple synapse locations on dendritic tree.
// when calculating convergences, a random destination synapse will be chosen.
// - if 0, then the source synapse will send SPIKE messages to all destination synapses in the syndest arglist
// --> this is useful for pairing AMPA and NMDA synapses
int k, num_source, num_dest
str name
// Count number of source and dest compartments
k=0
foreach name ({el {source}[]}); k = k + 1; end
num_source = {k}
k=0
foreach name ({el {dest}[]}); k = k + 1; end
num_dest = {k}
if (!allow_repeats)
if (is_recurrent)
if ({conv} > {num_source - 1})
echo Warning: convergence is greater than number of available source cells.
echo Allowing repeats for recurrent network.
allow_repeats = 1
end
else
if (conv > num_source)
echo Warning: convergence is greater than number of available source cells.
echo Allowing repeats.
allow_repeats = 1
end
end
end
if (is_recurrent)
if (num_source <= 1)
echo Only one source element - cannot form recurrent network
return
end
end
// For each destination cell, add the number "conv" presynaptic connections
for (k=0; k<num_dest; k=k+1)
conv_cell {source} {dest} {spikesource} {syndest} {conv} {is_recurrent} {allow_repeats} {random_dest} {k} {num_source}
end
end
//////////////////////////////
// Divergent connections
//////////////////////////////
function make_connection_div (dest, source)
//echo adding divergent synapse addmsg {source} {dest} SPIKE
addmsg {source} {dest} SPIKE
end
function div_cell (dest, source, syndest, spikesource, div, is_recurrent, allow_repeats, random_source, source_num, num_dest)
int i, j, r, t
int N_spikesource
str selected_spikesource
// Set up divergence table
create table /syntable
call /syntable TABCREATE {{div}-1} 0 1 // Creates a table with div entries
for (i=0; i<{div}; i=i+1)
setfield /syntable table->table[{i}] 0
end
j=0
t=1
while (j < div)
r = {rand 0 {num_dest + 0.9 - 1}} // Random number between 0 and "num_dest - 1"
// echo Proposed connection: dest->{r} source->{source_num}
if (is_recurrent)
if (r == source_num)
t=0 //if is recurrent network, don't want neuron k to synapse onto itself
// echo Self synapse! Skipping
end
end
if ({!allow_repeats})
for (i=0; i<{j}; i=i+1)
if({getfield /syntable table->table[{i}]} == r) // Check to see if the value is already taken
t=0 // if it's already taken, don't add to list
// echo Already taken! Skipping
end
end
end
if (t == 1)
setfield /syntable table->table[{j}] {r} // If all is well, add synapse to the list
j = j+1
// echo All's well, adding
end
t = 1
end
for (i=0;i<{div};i=i+1)
N_spikesource = {getarg {arglist {spikesource}} -count}
if (random_source)
r = {rand 1 {N_spikesource + 0.9}} // Random number between 1 and "N_spikesource"
selected_spikesource = {getarg {arglist {spikesource}} -arg {r}}
echo selected_spikesource = {getarg {arglist {spikesource}} -arg {r}}
make_connection_div {dest}[{getfield /syntable table->table[{i}]}]/{syndest} {source}[{source_num}]/{selected_spikesource}
else
for (j=1;j<={N_spikesource};j=j+1)
selected_spikesource = {getarg {arglist {spikesource}} -arg {j}}
make_connection_div {dest}[{getfield /syntable table->table[{i}]}]/{syndest} {source}[{source_num}]/{selected_spikesource}
end
end
end
delete /syntable
end
function div_connect (source, dest, spikesource, syndest, div, is_recurrent, allow_repeats, random_source)
// is_recurrent - if 1, network is recurrent (i.e. pyr2pyr) and therefore a synapse from neuron X -> neuron Y is only allowed if X≠Y
// allow_repeats - if 1, neuron X can synapse to neuron Y more than once. Useful for smaller networks
// random_source - if 1, spikesource is an argument list, likely containing multiple synapse locations on dendritic tree.
// when calculating divergences, a random sourceination synapse will be chosen.
// - if 0, then the dest synapse will send SPIKE messages to all sourceination synapses in the spikesource arglist
// --> this is useful for pairing AMPA and NMDA synapses
int k, num_dest, num_source
str name
// Count number of dest and source compartments
k=0
foreach name ({el {dest}[]}); k = k + 1; end
num_dest = {k}
k=0
foreach name ({el {source}[]}); k = k + 1; end
num_source = {k}
if (!allow_repeats)
if (is_recurrent)
if ({div} > {num_dest - 1})
echo Warning: divergence is greater than number of available dest cells.
echo Allowing repeats for recurrent network.
allow_repeats = 1
end
else
if (div > num_dest)
echo Warning: divergence is greater than number of available dest cells.
echo Allowing repeats.
allow_repeats = 1
end
end
end
if (is_recurrent)
if (num_dest <= 1)
echo Only one dest element - cannot form recurrent network
return
end
end
// For each source cell, add the number "div" postsynaptic connections
for (k=0; k<num_source; k=k+1)
div_cell {dest} {source} {syndest} {spikesource} {div} {is_recurrent} {allow_repeats} {random_source} {k} {num_dest}
end
end