; added wt_scl parameter to make same as IF5 init_net (except for constant values)
; 4/18/09: added "con_i_all" parameter
pro init_net, str, weights=weights, verbose=verbose, gaba=gaba, con_t=con_t, con_p=con_p, con_r=con_r, $
con_if=con_if, con_ir=con_ir, con_i_all=con_i_all, i_del=i_del, noise_wt=noise_wt, W_scl=W_scl
common path, home_path, single_path, avg_path, ps_path, latadj_path, dv_path, pca_path, bhv_path, $
image_path, ers_path, ica_path
common net_params, N_all, N_e, N_ir, N_if, dt, inv_dt, update, t_init, t_pre, t_stim, t_post, t_all
common vars, W, W_noise
common rand, seed
W = fltarr(N_all,N_all)
W_noise = fltarr(N_all)
if not(keyword_set(noise_wt)) then noise_wt=0.016
if keyword_set(weights) then begin
openr, fu, single_path + weights + '_weights.dat', /get_lun
readu, fu, W, W_noise & free_lun, fu
endif else begin
if not(keyword_set(gaba)) then gaba=0. $
else print, 'init_net: gaba = ', gaba
; Set up W by determining units to which unit i makes connections
; E->E
i=0 & e_e_con=fix(N_e*.10)
while (i LE N_e-1) do begin
ix = fix(randomu(seed,e_e_con) * N_e)
if (n_elements(uniq(ix,sort(ix))) EQ e_e_con) then begin
W[ix,i] = fltarr(e_e_con) + 1.
i+=1
endif
endwhile
print, 'e-e done'
; E->Ir
i=0 & e_ir_con=N_ir*.40
while (i LE N_e-1) do begin
a=randomu(seed,N_ir) & ix=uniq(a,sort(a))
if (n_elements(ix) EQ N_ir) then begin
W[N_e+ix[0:e_ir_con-1],i] = fltarr(e_ir_con) + 1.
i+=1
endif
endwhile
print, 'e-ir done'
; E->If
i=0 & e_if_con=N_if*.40
while (i LE N_e-1) do begin
ix = fix(randomu(seed,e_if_con) * N_if)
if (n_elements(uniq(ix,sort(ix))) EQ e_if_con) then begin
W[ix+N_e+N_ir,i] = fltarr(e_if_con) + 1.
i+=1
endif
endwhile
print, 'e-if done'
; Ir->E
i=N_e & ir_e_con=N_e*.50
while (i LE N_e+N_ir-1) do begin
a=randomu(seed,N_e) & ix=uniq(a,sort(a))
if (n_elements(ix) EQ N_e) then begin
W[ix[0:ir_e_con-1],i] = fltarr(ir_e_con) - 1.
i+=1
endif
endwhile
print, 'ir-e done'
; Ir->Ir
i=N_e & ir_ir_con=N_ir*.15
while (i LE N_e+N_ir-1) do begin
a=randomu(seed,N_ir) & ix=uniq(a,sort(a))
if (n_elements(ix) EQ N_ir) then begin
W[N_e+ix[0:ir_ir_con-1],i] = fltarr(ir_ir_con) - 1.
i+=1
endif
endwhile
print, 'ir-ir done'
; Ir->If
i=N_e & ir_if_con=N_if*.50
while (i LE N_e+N_ir-1) do begin
a = fix(randomu(seed,N_if) * 20000)
ix = uniq(a,sort(a))
if (n_elements(ix) EQ N_if) then begin
W[ix[0:ir_if_con-1]+N_e+N_ir,i] = fltarr(ir_if_con) - 1.
i+=1
endif
endwhile
print, 'ir-if done'
; If->E
i=N_e+N_ir & if_e_con=N_e*.50
while (i LE N_all-1) do begin
a=randomu(seed,N_e) & ix=uniq(a,sort(a))
if (n_elements(ix) EQ N_e) then begin
W[ix[0:if_e_con-1],i] = fltarr(if_e_con) - 1.
i+=1
endif
endwhile
print, 'if-e done'
; If->Ir
i=N_e+N_ir & if_ir_con=N_ir*.35
while (i LE N_all-1) do begin
a=randomu(seed,N_ir) & ix=uniq(a,sort(a))
if (n_elements(ix) EQ N_ir) then begin
W[N_e+ix[0:if_ir_con-1],i] = fltarr(if_ir_con) - 1.
i+=1
endif
endwhile
print, 'if-ir done'
; If->If
i=N_e+N_ir & if_if_con=N_if*.60
while (i LE N_all-1) do begin
a=randomu(seed,N_if) & ix=uniq(a,sort(a))
if (n_elements(ix) EQ N_if) then begin
W[N_e+N_ir+ix[0:if_if_con-1],i] = fltarr(if_if_con) - 1.
i+=1
endif
endwhile
print, 'if-if done'
W[0:N_e-1, 0:N_e-1] *= 0.01 ; E->E
W[N_e:N_e+N_ir-1, 0:N_e-1] *= 0.008 ; E->Ir
W[N_e+N_ir:*, 0:N_e-1] *= 0.019 ; E->If
W[0:N_e-1, N_e:N_e+N_ir-1] *= 0.008 ; Ir->E
W[N_e:N_e+N_ir-1, N_e:N_e+N_ir-1] *= 0.008 ; Ir->Ir
W[N_e+N_ir:*, N_e:N_e+N_ir-1] *= 0.008 ; Ir->If
W[0:N_e-1, N_e+N_ir:*] *= 0.019*(1. - gaba) ; If->E
W[N_e:N_e+N_ir-1, N_e+N_ir:*] *= 0.01*(1. - gaba) ; If->Ir
W[N_e+N_ir:*, N_e+N_ir:*] *= 0.01*(1. - gaba) ; If->If
if keyword_set(W_scl) then begin
W *= W_scl
print, 'global weight scaling = ', W_scl
endif else $
W *= 0.0825 ; global weight scaling
W_noise = fltarr(N_all) + noise_wt ; external noise input weights
endelse
print, 'Initial # weights: ', total(W NE 0.)
print, ' # excitatory weights: ', total(W GT 0.)
print, ' # inhibitory weights: ', total(W LT 0.)
print, ' # E->E weights: ', total(W[0:N_e-1,0:N_e-1] GT 0.)
if keyword_set(con_t) then begin
print, ' con_t = ', con_t
weight_ix = where(W[*] NE 0., n_weights)
W2 = W[weight_ix] ; nonzero connections
del_n = con_t*n_weights
ok=0
while (not(OK)) do begin
a=randomu(seed2,n_weights,/long) & ix=uniq(a,sort(a))
if (n_elements(ix) EQ n_weights) then ok=1
endwhile
delete_ix = ix[0:del_n-1]
W2[delete_ix] = 0.
W[weight_ix] = W2
n_weights_rem = total(W NE 0.)
print, ' # remaining weights = ', n_weights_rem,' ', float(n_weights_rem)/n_weights
endif
if keyword_set(con_p) then begin ; connections to pyramidal cells
print, ' con_p = ', con_p
W_p = W[0:N_e-1,*]
weight_ix = where(W_p[*] NE 0., n_weights)
W2 = W_p[weight_ix]
del_n = con_p*n_weights
ok=0
while (not(OK)) do begin
a=randomu(seed2,n_weights,/long) & ix=uniq(a,sort(a))
if (n_elements(ix) EQ n_weights) then ok=1
endwhile
delete_ix = ix[0:del_n-1]
W2[delete_ix] = 0.
W_p[weight_ix] = W2
W[0:N_e-1,*] = W_p
n_weights_rem = total(W NE 0.)
print, ' # remaining weights = ', n_weights_rem,' ', float(n_weights_rem)/n_weights
endif
if keyword_set(con_r) then begin ; recurrent excitatory connections (btw pyramidal cells)
print, ' con_r = ', con_r
W_p = W[0:N_e-1,0:N_e-1]
weight_ix = where(W_p[*] NE 0., n_weights)
W2 = W_p[weight_ix]
del_n = con_r*n_weights
ok=0
while (not(OK)) do begin
a=randomu(seed2,n_weights,/long) & ix=uniq(a,sort(a))
if (n_elements(ix) EQ n_weights) then ok=1
endwhile
delete_ix = ix[0:del_n-1]
W2[delete_ix] = 0.
W_p[weight_ix] = W2
W[0:N_e-1,0:N_e-1] = W_p
n_weights_rem = total(W NE 0.)
print, ' # remaining weights = ', n_weights_rem,' ', float(n_weights_rem)/n_weights
endif
if keyword_set(con_if) then begin ; If-cell connections
print, ' con_if = ', con_if
; projections from If-cells to all other cells
W_p = W[*,N_e+N_ir:*]
weight_ix = where(W_p[*] NE 0., n_weights)
W2 = W_p[weight_ix]
del_n = con_if*n_weights
ok=0
while (not(OK)) do begin
a=randomu(seed2,n_weights,/long) & ix=uniq(a,sort(a))
if (n_elements(ix) EQ n_weights) then ok=1
endwhile
delete_ix = ix[0:del_n-1]
W2[delete_ix] = 0.
W_p[weight_ix] = W2
W[*,N_e+N_ir:*] = W_p
; projections to If-cells from E- and Ir-cells
W_p = W[N_e+N_ir:*,0:N_e+N_ir-1]
weight_ix = where(W_p[*] NE 0., n_weights)
W2 = W_p[weight_ix]
del_n = con_if*n_weights
ok=0
while (not(OK)) do begin
a=randomu(seed2,n_weights,/long) & ix=uniq(a,sort(a))
if (n_elements(ix) EQ n_weights) then ok=1
endwhile
delete_ix = ix[0:del_n-1]
W2[delete_ix] = 0.
W_p[weight_ix] = W2
W[N_e+N_ir:*,0:N_e+N_ir-1] = W_p
n_weights_rem = total(W NE 0.)
print, ' # remaining weights = ', n_weights_rem,' ', float(n_weights_rem)/n_weights
endif
if keyword_set(con_ir) then begin ; Ir-cell connections
print, ' con_ir = ', con_ir
; projections from Ir-cells to all other cells
W_p = W[*,N_e:N_e+N_ir-1]
weight_ix = where(W_p[*] NE 0., n_weights)
W2 = W_p[weight_ix]
del_n = con_ir*n_weights
ok=0
while (not(OK)) do begin
a=randomu(seed2,n_weights,/long) & ix=uniq(a,sort(a))
if (n_elements(ix) EQ n_weights) then ok=1
endwhile
delete_ix = ix[0:del_n-1]
W2[delete_ix] = 0.
W_p[weight_ix] = W2
W[*,N_e:N_e+N_ir-1] = W_p
; projections from E-cells to Ir-cells
W_p = W[N_e:N_e+N_ir-1,0:N_e-1]
weight_ix = where(W_p[*] NE 0., n_weights)
W2 = W_p[weight_ix]
del_n = con_ir*n_weights
ok=0
while (not(OK)) do begin
a=randomu(seed2,n_weights,/long) & ix=uniq(a,sort(a))
if (n_elements(ix) EQ n_weights) then ok=1
endwhile
delete_ix = ix[0:del_n-1]
W2[delete_ix] = 0.
W_p[weight_ix] = W2
W[N_e:N_e+N_ir-1,0:N_e-1] = W_p
; projections from If-cells to Ir-cells
W_p = W[N_e:N_e+N_ir-1,N_e+N_ir:*]
weight_ix = where(W_p[*] NE 0., n_weights)
W2 = W_p[weight_ix]
del_n = con_ir*n_weights
ok=0
while (not(OK)) do begin
a=randomu(seed2,n_weights,/long) & ix=uniq(a,sort(a))
if (n_elements(ix) EQ n_weights) then ok=1
endwhile
delete_ix = ix[0:del_n-1]
W2[delete_ix] = 0.
W_p[weight_ix] = W2
W[N_e:N_e+N_ir-1,N_e+N_ir:*] = W_p
n_weights_rem = total(W NE 0.)
print, ' # remaining weights = ', n_weights_rem,' ', float(n_weights_rem)/n_weights
endif
if keyword_set(con_i_all) then begin ; Ir- and If-cell connections
print, ' con_ir = ', con_ir
; projections from I-cells to all other cells
W_p = W[*,N_e:*]
weight_ix = where(W_p[*] NE 0., n_weights)
W2 = W_p[weight_ix]
del_n = con_i_all*n_weights
ok=0
while (not(OK)) do begin
a=randomu(seed2,n_weights,/long) & ix=uniq(a,sort(a))
if (n_elements(ix) EQ n_weights) then ok=1
endwhile
delete_ix = ix[0:del_n-1]
W2[delete_ix] = 0.
W_p[weight_ix] = W2
W[*,N_e:*] = W_p
; projections from E-cells to I-cells
W_p = W[N_e:*,0:N_e-1]
weight_ix = where(W_p[*] NE 0., n_weights)
W2 = W_p[weight_ix]
del_n = con_i_all*n_weights
ok=0
while (not(OK)) do begin
a=randomu(seed2,n_weights,/long) & ix=uniq(a,sort(a))
if (n_elements(ix) EQ n_weights) then ok=1
endwhile
delete_ix = ix[0:del_n-1]
W2[delete_ix] = 0.
W_p[weight_ix] = W2
W[N_e:*,0:N_e-1] = W_p
n_weights_rem = total(W NE 0.)
print, ' # remaining weights = ', n_weights_rem,' ', float(n_weights_rem)/n_weights
endif
if keyword_set(i_del) then begin
del_n = i_del*(N_ir+N_if)
print, 'init_net: i_del units = ', del_n
delete_ix = N_e + long(randomu(seed2,del_n) * (N_ir+N_if))
W[*,delete_ix] = 0.
W[delete_ix,*] = 0.
endif
print, 'Final # weights: ', total(W NE 0.)
print, ' # excitatory weights: ', total(W GT 0.)
print, ' # inhibitory weights: ', total(W LT 0.)
print, ' # E->E weights: ', total(W[0:N_e-1,0:N_e-1] GT 0.)
if keyword_set(verbose) then begin
print, 'mean weights: ', total(W)/N_all, total(W[0:N_e-1,*])/N_e, total(W[N_e:N_e+N_ir-1,*])/N_ir, $
total(W[N_e+N_ir:*,*])/N_if
W2 = W GT 0.
print, 'mean E->E connections per E-cell: ', total(W2[0:N_e-1,0:N_e-1])/N_e
print, 'mean E->Ir connections per E-cell: ', total(W2[N_e:N_e+N_ir-1,0:N_e-1])/N_e
print, 'mean E->If connections per E-cell: ', total(W2[N_e+N_ir:*,0:N_e-1])/N_e
W2 = W LT 0.
print, 'mean Ir->E connections per Ir-cell: ', total(W2[0:N_e-1,N_e:N_e+N_ir-1])/N_ir
print, 'mean Ir->Ir connections per Ir-cell: ', total(W2[N_e:N_e+N_ir-1,N_e:N_e+N_ir-1])/N_ir
print, 'mean Ir->If connections per Ir-cell: ', total(W2[N_e+N_ir:*,N_e:N_e+N_ir-1])/N_ir
print, 'mean If->E connections per If-cell: ', total(W2[0:N_e-1,N_e+N_ir:*])/N_if
print, 'mean If->Ir connections per If-cell: ', total(W2[N_e:N_e+N_ir-1,N_e+N_ir:*])/N_if
print, 'mean If->If connections per If-cell: ', total(W2[N_e+N_ir:*,N_e+N_ir:*])/N_if
scale=1
window, 0, xsize=N_all*scale, ysize=N_all*scale, title='init_net: ' + str
tvscl, congrid(bytscl(W), N_all*scale, N_all*scale)
endif
openw, fu, single_path + str + '_param.txt', /get_lun
printf, fu, N_all, N_e, N_ir, N_if, dt, inv_dt, update, t_init, t_pre, t_stim, t_post, t_all
free_lun, fu
openw, fu, single_path + str + '_weights.dat', /get_lun
writeu, fu, W, W_noise
free_lun, fu
print, 'init_net: ', str, ' done'
return
end