| 1156 | | |
| 1157 | | def _2D_Gauss(self,parameters,synapse_type=None): |
| 1158 | | """ |
| 1159 | | Source neuron is connected to a 2D targetd population with a spatial profile (Gauss). |
| 1160 | | parameters should have: |
| 1161 | | rng: |
| 1162 | | source_position: x,y of source neuron mapped to target populatio. |
| 1163 | | source_id: source id |
| 1164 | | n: number of synpases |
| 1165 | | sigma: sigma of the Gauss |
| 1166 | | """ |
| 1167 | | self.synapse_type = synapse_type |
| 1168 | | def rcf_2D(parameters): |
| 1169 | | rng = parameters['rng'] |
| 1170 | | pre_id = parameters['pre_id'] |
| 1171 | | pre_position = parameters['pre_position'] |
| 1172 | | n = parameters['n'] |
| 1173 | | sigma = parameters['sigma'] |
| 1174 | | weight = parameters['weight'] |
| 1175 | | delay = parameters['delay'] |
| 1176 | | |
| 1177 | | phi = rng.uniform(size=n)*(2.0*pi) |
| 1178 | | r = rng.normal(scale=sigma,size=n) |
| 1179 | | target_position_x = numpy.floor(pre_position[1]+r*numpy.cos(phi)) |
| 1180 | | target_position_y = numpy.floor(pre_position[0]+r*numpy.sin(phi)) |
| 1181 | | target_id = [] |
| 1182 | | for syn_nr in range(len(target_position_x)): |
| 1183 | | #print syn_nr |
| 1184 | | try: |
| 1185 | | # print target_position_x[syn_nr] |
| 1186 | | target_id.append(self.post[(target_position_x[syn_nr],target_position_y[syn_nr])]) |
| 1187 | | # print target_id |
| 1188 | | except IndexError: |
| 1189 | | target_id.append(False) |
| 1190 | | |
| 1191 | | pynest.divConnect(pre_id,target_id,[weight],[delay]) |
| 1192 | | |
| 1193 | | |
| 1194 | | n = parameters['n'] |
| 1195 | | |
| 1196 | | if n > 0: |
| 1197 | | ratio_dim_pre_post = ((1.*self.pre.dim[0])/(1.*self.post.dim[0])) |
| 1198 | | print 'ratio_dim_pre_post',ratio_dim_pre_post |
| 1199 | | run_id = 0 |
| 1200 | | |
| 1201 | | for pre in numpy.reshape(self.pre.cell,(self.pre.cell.size)): |
| 1202 | | #print 'pre',pre |
| 1203 | | run_id +=1 |
| 1204 | | #print 'run_id',run_id |
| 1205 | | if numpy.mod(run_id,500) == 0: |
| 1206 | | print 'run_id',run_id |
| 1207 | | |
| 1208 | | pre_position_tmp = self.pre.locate(pre) |
| 1209 | | parameters['pre_position'] = numpy.divide(pre_position_tmp,ratio_dim_pre_post) |
| 1210 | | parameters['pre_id'] = pre |
| 1211 | | #a=Projection(self.pre,self.post,'rcf_2D',parameters) |
| 1212 | | rcf_2D(parameters) |
| 1213 | | |
| 1214 | | def _test_delay(self,params,synapse_type=None): |
| 1215 | | self.synapse_type = synapse_type |
| 1216 | | # debug get delays from outside |
| 1217 | | #delay_array = parameters['delays_array'] |
| 1218 | | #weight_array = parameters['weights_array'] |
| 1219 | | #target_id = parameters['target_id'] |
| 1220 | | #pre_id = parameters['pre_id'] |
| 1221 | | print 'inside test_delay' |
| 1222 | | print 'delays ',params['delays_array'] |
| 1223 | | print 'weights ',params['weights_array'] |
| 1224 | | print 'pre_id ',params['pre_id'] |
| 1225 | | print 'target_id ',params['target_id'] |
| 1226 | | eval(params['eval_string']) |
| 1227 | | #cons=pynest.divConnect(params['pre_id'],params['target_id'],params['weights_array'].tolist(),params['delays_array'].tolist()) |
| 1228 | | #pynest.divConnect(pre_id,target_id,weight_array.tolist(),delay_array.tolist()) |
| 1229 | | print 'leaving test_delay' |
| 1230 | | |
| 1231 | | def _3D_Gauss(self,parameters,synapse_type=None): |
| 1232 | | """ |
| 1233 | | Source neuron is connected to a 3D targetd population with a spatial profile (Gauss). |
| 1234 | | parameters should have: |
| 1235 | | rng: |
| 1236 | | source_position: x,y of source neuron mapped to target populatio. |
| 1237 | | source_id: source id |
| 1238 | | n: number of synpases |
| 1239 | | sigma: sigma of the Gauss |
| 1240 | | """ |
| 1241 | | #def get_ids(self,parameters): |
| 1242 | | #ids = [] |
| 1243 | | #if len(addrs) == self.ndim: |
| 1244 | | # |
| 1245 | | #for addr in range(len(parameters['x'])): |
| 1246 | | # try: |
| 1247 | | # ids = numpy.append(ids,post.cell[addr]) |
| 1248 | | # except IndexError: |
| 1249 | | # pass |
| 1250 | | #else: |
| 1251 | | # raise common.InvalidDimensionsError, "Population has %d dimensions. Address was %s" % (self.ndim,str(addrs)) |
| 1252 | | #return ids.astype('int') |
| 1253 | | |
| 1254 | | |
| 1255 | | def rcf_3D(parameters): |
| 1256 | | rng = parameters['rng'] |
| 1257 | | rng_params = parameters['rng_params'] |
| 1258 | | pre_id = parameters['pre_id'] |
| 1259 | | pre_position = parameters['pre_position'] |
| 1260 | | n = parameters['n'] |
| 1261 | | sigma = parameters['sigma'] |
| 1262 | | weight = parameters['weight'] |
| 1263 | | weight = weight*1000 # weights should be in nA or µS, but iaf_neuron uses pA and iaf_cond_neuron uses nS. |
| 1264 | | # Using convention in this way is not ideal. We should be able to look up the units used by each model somewhere. |
| 1265 | | |
| 1266 | | min_delay_offset = parameters['min_delay_offset'] |
| 1267 | | post_dim = parameters['post_dim'] |
| 1268 | | params_dist = parameters['params_dist'] |
| 1269 | | size_in_mm = parameters['size_in_mm'] |
| 1270 | | #architecture = parameters['architecture'] |
| 1271 | | conduction_speed = parameters['conduction_speed'] |
| 1272 | | #min_delay = parameters['min_delay'] |
| 1273 | | |
| 1274 | | phi = rng.uniform(size=n)*(2.0*pi) |
| 1275 | | r = rng.normal(scale=sigma,size=n) |
| 1276 | | # for z |
| 1277 | | #h = rng.uniform(size=n)*post_dim[2] # here post dim because it does not metter where it comes from in pre dim |
| 1278 | | |
| 1279 | | target_position_x = numpy.floor(pre_position[1]+r*numpy.cos(phi)).astype('int') |
| 1280 | | target_position_y = numpy.floor(pre_position[0]+r*numpy.sin(phi)).astype('int') |
| 1281 | | |
| 1282 | | |
| 1283 | | # because array[-1] gives you the last entrie, we have to get rid of the negative values, in either x or y |
| 1284 | | valid_positions= eval('target_position_x >= 0')*eval('target_position_y >= 0') |
| 1285 | | target_position_x = target_position_x[valid_positions] |
| 1286 | | target_position_y = target_position_y[valid_positions] |
| 1287 | | r = r[valid_positions]# this is needed for the distant dependant delay |
| 1288 | | # new n |
| 1289 | | n = len(target_position_x) |
| 1290 | | |
| 1291 | | # for z dim, here we dont have to remove unvalid pos, because the values can not be unvalid since it is unfiorm dis between the limits |
| 1292 | | # however, n is reduced |
| 1293 | | h = rng.uniform(size=n)*post_dim[2] # here post dim because it does not metter where it comes from in pre dim |
| 1294 | | target_position_z = numpy.floor(h).astype('int') |
| 1295 | | |
| 1296 | | target_id = [] |
| 1297 | | # an array of bool, will be filled with True if synpase is on the grid, with False when outside |
| 1298 | | target_id_bool = numpy.array([],dtype='bool') |
| 1299 | | # __getitems__ version |
| 1300 | | |
| 1301 | | |
| 1302 | | for syn_nr in range(len(target_position_x)): |
| 1303 | | try: |
| 1304 | | target_id.append(self.post.cell[(target_position_x[syn_nr],target_position_y[syn_nr],target_position_z[syn_nr])]) |
| 1305 | | #target_id.append(self.post[(target_position_x[syn_nr],target_position_y[syn_nr],target_position_z[syn_nr])]) |
| 1306 | | target_id_bool = numpy.append(target_id_bool,True) |
| 1307 | | #target_id_bool.append(True) |
| 1308 | | except IndexError: |
| 1309 | | target_id_bool = numpy.append(target_id_bool,False) |
| 1310 | | #target_id_bool.append(False) |
| 1311 | | #pass |
| 1312 | | # some synapses fall outside the grid, they are lost |
| 1313 | | #target_id.append(False) |
| 1314 | | |
| 1315 | | # number of synapses that are actually made |
| 1316 | | n_syn = len(target_id) |
| 1317 | | # r will be used to calculate the distant dependent delay, but since some synapses have not been made, they have to be removed |
| 1318 | | r_syn = numpy.abs(r[target_id_bool]) |
| 1319 | | # print 'min r_syn: ',r_syn.min() |
| 1320 | | # print 'max r_syn: ',r_syn.max() |
| 1321 | | # from r_syn we calculate the delay, with 0.1 m/s --> 0.1 mm/ms |
| 1322 | | # r_syn is in units of population size, meaning in grid size, since sigma was around 0.4 of p.dim |
| 1323 | | # we have to convert it to mm to get delay in mm/ms |
| 1324 | | # we do this by: r_syn * architecture['a']/post_dim[0] , the x dim of the post synaptic population |
| 1325 | | # should give us: r_syn in mm, since r_syn [in grid units], post_dim[0] [max grid units], architecture['a'] is in mm |
| 1326 | | # print 'size_in_mm: ',size_in_mm |
| 1327 | | # print 'post_dim[0]: ',post_dim[0] |
| 1328 | | # print 'conduction_speed: ',conduction_speed |
| 1329 | | # print 'params dist: ',params_dist |
| 1330 | | # units*mm/units |
| 1331 | | r_syn2 = r_syn*size_in_mm/numpy.float(post_dim[0]) |
| 1332 | | #print 'type r_syn',type(r_syn) |
| 1333 | | # there is a min dely, which is around 1.0 ms, params['min_delay'] see Markam 97 |
| 1334 | | min_delay_offset_array = rng_params.normal(loc=min_delay_offset,scale=abs(min_delay_offset*params_dist),size=n_syn) |
| 1335 | | #print 'type min_delay',type(min_delay_array) |
| 1336 | | # print 'min min_delay_arrayr_syn: ',min_delay_array.min() |
| 1337 | | # print 'max min_delay_array: ',min_delay_array.max() |
| 1338 | | delay_array = numpy.add(r_syn2/conduction_speed,min_delay_offset_array) |
| 1339 | | #delay_array=delay_array.round(decimals=2) |
| 1340 | | #print 'type delay_array',type(delay_array) |
| 1341 | | #print 'min delay_arrayr: ',delay_array.min() |
| 1342 | | #print 'max delay_array: ',delay_array.max() |
| 1343 | | #print 'min delay_arrayr.tolsit(): ',min(delay_array.tolist()) |
| 1344 | | #print 'max delay_array.tolist(): ',max(delay_array.tolist()) |
| 1345 | | #print 'params dist', params_dist |
| 1346 | | #if params_dist >0: |
| 1347 | | #print 'with dist' |
| 1348 | | # print 'n_syn',n_syn |
| 1349 | | # print 'abs(weight*params_dist) ',abs(weight*params_dist) |
| 1350 | | # print 'weight ', weight |
| 1351 | | |
| 1352 | | |
| 1353 | | weight_array = rng_params.normal(loc=weight,scale=abs(weight*params_dist),size=n_syn) |
| 1354 | | #weight_array=weight_array.round(decimals=2) |
| 1355 | | #delay_list = rng_params.normal(loc=delay,scale=delay/params_dist,size=n_syn) |
| 1356 | | #delay_list = r_syn/transmission_speed |
| 1357 | | |
| 1358 | | |
| 1359 | | # debug get delays from outside |
| 1360 | | #delay_array = parameters['delays_array'] |
| 1361 | | #weight_array = parameters['weights_array'] |
| 1362 | | #target_id = parameters['target_id'] |
| 1363 | | #if pre_id==100: |
| 1364 | | # print '#############################################' |
| 1365 | | # print 'This is the data in 3D Gauss' |
| 1366 | | # print '#############################################' |
| 1367 | | # print 'preneuron id',pre_id |
| 1368 | | #print 'r_syn: ',r_syn |
| 1369 | | #print 'r_syn2',r_syn2 |
| 1370 | | #print 'min_delay_offset_array ',min_delay_offset_array |
| 1371 | | # print 'delay_array ',delay_array |
| 1372 | | # print 'type first element of delay ',type(delay_array[0]) |
| 1373 | | # print 'weight ',weight_array |
| 1374 | | # print 'type first element of weight ',type(weight_array[0]) |
| 1375 | | # print 'now we dive into pynest.hl_api.... yeah' |
| 1376 | | # print '#############################################' |
| 1377 | | # print '\n' |
| 1378 | | #print 'size_in_mm: ',size_in_mm |
| 1379 | | #print 'post_dim[0]: ',post_dim[0] |
| 1380 | | #print 'conduction_speed: ',conduction_speed |
| 1381 | | #print 'params dist: ',params_dist |
| 1382 | | # printed = True |
| 1383 | | # done = True |
| 1384 | | #print 'len delay == len weigth',len(delay_array.tolist())==len(weight_array.tolist()) |
| 1385 | | #print 'len weigth ', len(weight_array.tolist()) |
| 1386 | | #print 'delay list: ',type(delay_array.tolist()) |
| 1387 | | |
| 1388 | | #pynest.divConnect(pre_id,target_id,weight_array.tolist(),delay_array.tolist()) |
| 1389 | | #delays_array = rng.normal(loc=pynest.getDict([0])[0]['max_delay']/2.,scale=abs(pynest.getDict([0])[0]['max_delay']/2.*params_dist),size=n) |
| 1390 | | #weights_array = delays_array |
| 1391 | | |
| 1392 | | pynest.divConnect(pre_id,target_id,weight_array.tolist(),delay_array.tolist()) |
| 1393 | | |
| 1394 | | #return delay_array |
| 1395 | | #else: |
| 1396 | | #print 'no dist' |
| 1397 | | # pynest.divConnect(pre_id,target_id,[weight],[delay]) |
| 1398 | | |
| 1399 | | |
| 1400 | | n = parameters['n'] |
| 1401 | | #global printed |
| 1402 | | #printed = False |
| 1403 | | #done = False |
| 1404 | | if n > 0: |
| 1405 | | ratio_dim_pre_post = ((1.*self.pre.dim[0])/(1.*self.post.dim[0])) |
| 1406 | | #print 'ratio_dim_pre_post',ratio_dim_pre_post |
| 1407 | | run_id = 0 |
| 1408 | | |
| 1409 | | for pre in numpy.reshape(self.pre.cell,(self.pre.cell.size)): |
| 1410 | | #if done: |
| 1411 | | # return |
| 1412 | | #print 'pre',pre |
| 1413 | | run_id +=1 |
| 1414 | | #print 'run_id',run_id |
| 1415 | | if numpy.mod(run_id,500) == 0: |
| 1416 | | print 'run_id',run_id |
| 1417 | | |
| 1418 | | pre_position_tmp = self.pre.locate(pre) |
| 1419 | | parameters['pre_position'] = numpy.divide(pre_position_tmp,ratio_dim_pre_post) |
| 1420 | | parameters['pre_id'] = pre |
| 1421 | | parameters['post_dim'] = self.post.dim |
| 1422 | | #a=Projection(self.pre,self.post,'rcf_2D',parameters) |
| 1423 | | rcf_3D(parameters) |
| 1424 | | #if done: |
| 1425 | | # return |
| 1426 | | |
| 1427 | | |