-
Notifications
You must be signed in to change notification settings - Fork 3
Closed
Description
Hi there @bjarthur
Actually I lied in this issue title. I can now get the Potjans connectome to work as a static matrix, for kind=:init, if I hacked params.jl and init.jl, I will send details and links to hacked code soon.
To reproduce this error:
run
bash workflow.sh
In the base directory at: https://github.com/JuliaWSU/TrainSpikingNet.jl
Relevant contents of param.jl https://github.com/JuliaWSU/TrainSpikingNet.jl/blob/master/src/param.jl
genPlasticWeights_file = "genWeightsPotjans.jl"
genStaticWeights_file = "genWeightsPotjans.jl"
genPlasticWeights_args = Dict(:Ncells => Ncells, :frac => frac, :Ne => Ne, :L => L, :Lexc => Lexc, :Linh => Linh, :Lffwd => Lffwd,
:wpee => 2.0 * taue * g / wpscale,
:wpie => 2.0 * taue * g / wpscale,
:wpei => -2.0 * taue * g / wpscale,
:wpii => -2.0 * taue * g / wpscale,
:wpffwd => 0)
genStaticWeights_args = Dict(:Ncells => Ncells, :Ne => Ne,
:pree => 0.1, :prie => 0.1, :prei => 0.1, :prii => 0.1)
./tsn.sh init ${PWD}/srcRelevant contents of https://github.com/JuliaWSU/TrainSpikingNet.jl/blob/master/src/genWeightsPotjans.jl
using Revise
using SparseArrays
using ProgressMeter
function potjans_params()
conn_probs = [[0.1009, 0.1689, 0.0437, 0.0818, 0.0323, 0., 0.0076, 0. ],
[0.1346, 0.1371, 0.0316, 0.0515, 0.0755, 0., 0.0042, 0. ],
[0.0077, 0.0059, 0.0497, 0.135, 0.0067, 0.0003, 0.0453, 0. ],
[0.0691, 0.0029, 0.0794, 0.1597, 0.0033, 0., 0.1057, 0. ],
[0.1004, 0.0622, 0.0505, 0.0057, 0.0831, 0.3726, 0.0204, 0. ],
[0.0548, 0.0269, 0.0257, 0.0022, 0.06, 0.3158, 0.0086, 0. ],
[0.0156, 0.0066, 0.0211, 0.0166, 0.0572, 0.0197, 0.0396, 0.2252],
[0.0364, 0.001, 0.0034, 0.0005, 0.0277, 0.008, 0.0658, 0.1443]]
columns_conn_probs = [col for col in eachcol(conn_probs)][1]
layer_names = ["23E","23I","4E","4I","5E", "5I", "6E", "6I"]
ccuf = Dict(
k=>v for (k,v) in zip(layer_names,columns_conn_probs)
)
ccu = Dict("23E"=>20683, "23I"=>5834,
"4E"=>21915, "4I"=>5479,
"5E"=>4850, "5I"=>1065,
"6E"=>14395, "6I"=>2948)
ccu = Dict((k,ceil(Int64,v/35.0)) for (k,v) in pairs(ccu))
cumulative = Dict()
v_old=1
for (k,v) in pairs(ccu)
cumulative[k]=collect(v_old:v+v_old)
v_old=v+v_old
end
return (cumulative,ccu,ccuf,layer_names,columns_conn_probs,conn_probs)
end
function potjans_weights(Ncells)
(cumulative,ccu,ccuf,layer_names,columns_conn_probs,conn_probs) = potjans_params()
Ncells = sum([i for i in values(ccu)])+1#max([max(i[:]) for i in values(cumulative)])
w0Index_ = spzeros(Int,Ncells,Ncells)
w0Weights = spzeros(Float32,Ncells,Ncells)
edge_dict = Dict()
polarity = Dict()
for src in 1:p.Ncells
edge_dict[src] = Int64[]
polarity[src] = ""
end
Ne = 0
Ni = 0
@showprogress for (i,(k,v)) in enumerate(pairs(cumulative))
for src in v
for (j,(k1,v1)) in enumerate(pairs(cumulative))
for tgt in v1
if src!=tgt
prob = conn_probs[i][j]
if rand()<prob
if occursin("E",k)
if occursin("E",k1)
# TODO replace synaptic weight values.
# w_mean = 87.8e-3 # nA
w0Weights[tgt,src] = p.je#*#350.0#)/2.0
elseif occursin("I",k1)
w0Weights[tgt,src] = p.jx#*150.0
end
polarity[src]="E"
Ne+=1
elseif occursin("I",k)
if occursin("E",k1)
w0Weights[tgt,src] = -p.jx
elseif occursin("I",k1)
w0Weights[tgt,src] = -p.ji#*2.0
end
polarity[src]="I"
Ni+=1
end
append!(edge_dict[src],tgt)
w0Index_[tgt,src] = tgt
end
end
end
end
end
end
return (edge_dict,w0Weights,w0Index_,Ne,Ni)
end
function genPlasticWeights(args, w0Index, nc0, ns0)
Ncells, frac, Ne, L, Lexc, Linh, Lffwd, wpee, wpie, wpei, wpii, wpffwd = map(x->args[x],
[:Ncells, :frac, :Ne, :L, :Lexc, :Linh, :Lffwd, :wpee, :wpie, :wpei, :wpii, :wpffwd])
(edge_dict,w0Weights,w0Index_,Ne,Ni) = potjans_weights(Ncells)
##
# nc0Max is the maximum number of post synaptic targets
# its a limit on the outdegree.
# if this is not known upfront it can be calculated on the a pre-exisiting adjacency matrix as I do below.
##
nc0Max = 0
for (k,v) in pairs(edge_dict)
templength = length(v)
if templength>nc0Max
nc0Max=templength
end
end
#nc0Max = Ncells-1 # outdegree
nc0 = Int.(nc0Max*ones(Ncells))
w0Index = spzeros(Int,nc0Max,Ncells)
for pre_cell = 1:Ncells
post_cells = edge_dict[pre_cell]
w0Index[1:length(edge_dict[pre_cell]),pre_cell] = post_cells
end
wpIndexIn = w0Index
wpWeightIn = w0Weights
ncpIn = nc0
wpWeightFfwd = randn(rng, p.Ncells, p.Lffwd) * wpffwd
return wpWeightFfwd, wpWeightIn, wpIndexIn, ncpIn
end
function genStaticWeights(args)
Ncells, _, pree, prie, prei, prii, jee, jie, jei, jii = map(x->args[x],
[:Ncells, :Ne, :pree, :prie, :prei, :prii, :jee, :jie, :jei, :jii])
(edge_dict,w0Weights,w0Index_,Ne,Ni) = potjans_weights(Ncells)
nc0Max = 0
for (k,v) in pairs(edge_dict)
templength = length(v)
if templength>nc0Max
nc0Max=templength
end
end
#nc0Max = Ncells-1 # outdegree
nc0 = Int.(nc0Max*ones(Ncells))
w0Index = spzeros(Int,nc0Max,Ncells)
for pre_cell = 1:Ncells
post_cells = edge_dict[pre_cell]
w0Index[1:length(edge_dict[pre_cell]),pre_cell] = post_cells
end
wpIndexIn = w0Index
wpWeightIn = w0Weights
ncpIn = nc0
wpWeightFfwd = randn(rng, p.Ncells, p.Lffwd) * wpffwd
return w0Index, w0Weights, nc0
end
The connection matrix gets made by the above function stack (as you can see with this ascii art):

Metadata
Metadata
Assignees
Labels
No labels