def generate_synapse_list(self, prevertex, postvertex, delay_scale, synapse_type): id_lists = list() weight_lists = list() delay_lists = list() type_lists = list() for _ in range(0, prevertex.atoms): id_lists.append(list()) weight_lists.append(list()) delay_lists.append(list()) type_lists.append(list()) for i in range(0, len(self.conn_list)): conn = self.conn_list[i] pre_atom = generateParameter(conn[0], i) post_atom = generateParameter(conn[1], i) weight = generateParameter(conn[2], i) delay = generateParameter(conn[3], i) * delay_scale id_lists[pre_atom].append(post_atom) weight_lists[pre_atom].append(weight) delay_lists[pre_atom].append(delay) type_lists[pre_atom].append(synapse_type) connection_list = [SynapseRowInfo(id_lists[i], weight_lists[i], delay_lists[i], type_lists[i]) for i in range(0, prevertex.atoms)] return SynapticList(connection_list)
def generate_synapse_list(self, prevertex, postvertex, delay_scale, synapse_type): id_lists = list() weight_lists = list() delay_lists = list() type_lists = list() for _ in range(0, prevertex.atoms): id_lists.append(list()) weight_lists.append(list()) delay_lists.append(list()) type_lists.append(list()) numIncomingAxons = prevertex.atoms numTargetNeurons = postvertex.atoms for _ in range(0, self.numSynapses): source = int(random() * numIncomingAxons) target = int(random() * numTargetNeurons) weight = generateParameter(self.weights, target) delay = generateParameter(self.weights, target) * delay_scale id_lists[source].append(target) weight_lists[source].append(weight) delay_lists[source].append(delay) type_lists[source].append(synapse_type) connection_list = [SynapseRowInfo(id_lists[i], weight_lists[i], delay_lists[i], type_lists[i]) for i in range(0, prevertex.atoms)] return SynapticList(connection_list)
def generate_synapse_list(self, prevertex, postvertex, delay_scale, synapse_type): id_lists = list() weight_lists = list() delay_lists = list() type_lists = list() for _ in range(0, prevertex.atoms): id_lists.append(list()) weight_lists.append(list()) delay_lists.append(list()) type_lists.append(list()) for i in range(0, len(self.conn_list)): conn = self.conn_list[i] pre_atom = generateParameter(conn[0], i) post_atom = generateParameter(conn[1], i) weight = generateParameter(conn[2], i) delay = generateParameter(conn[3], i) * delay_scale id_lists[pre_atom].append(post_atom) weight_lists[pre_atom].append(weight) delay_lists[pre_atom].append(delay) type_lists[pre_atom].append(synapse_type) connection_list = [ SynapseRowInfo(id_lists[i], weight_lists[i], delay_lists[i], type_lists[i]) for i in range(0, prevertex.atoms) ] return SynapticList(connection_list)
def generate_synapse_list(self, prevertex, postvertex, delay_scale, synapse_type): connection_list = list() for pre_atom in range(0, prevertex.atoms): delay = generateParameter(self.delays, pre_atom) * delay_scale weight = generateParameter(self.weights, pre_atom) connection_list.append(SynapseRowInfo([pre_atom], [weight], [delay], [synapse_type])) return SynapticList(connection_list)
def writePoissonParameters(self, spec, machineTimeStep, processor, numNeurons): """ Generate Neuron Parameter data for Poisson spike sources (region 2): """ spec.comment("\nWriting Neuron Parameters for %d poisson sources:\n" % numNeurons) # Set the focus to the memory region 2 (neuron parameters): spec.switchWriteFocus(region = POISSON_PARAMS_REGION) # Write header info to the memory region: # Write Key info for this core: chipX, chipY, chipP = processor.get_coordinates() populationIdentity = \ packet_conversions.get_key_from_coords(chipX, chipY, chipP) spec.write(data = populationIdentity) # Write the random seed (4 words), generated randomly! if self.seed == None: spec.write(data = numpy.random.randint(0x7FFFFFFF)) spec.write(data = numpy.random.randint(0x7FFFFFFF)) spec.write(data = numpy.random.randint(0x7FFFFFFF)) spec.write(data = numpy.random.randint(0x7FFFFFFF)) else: spec.write(data = self.seed[0]) spec.write(data = self.seed[1]) spec.write(data = self.seed[2]) spec.write(data = self.seed[3]) # For each neuron, get the rate to work out if it is a slow # or fast source slow_sources = list() fast_sources = list() for i in range(0, numNeurons): # Get the parameter values for source i: rateVal = generateParameter(self.rate, i) startVal = generateParameter(self.start, i) endVal = generateParameter(self.duration, i) + startVal # Decide if it is a fast or slow source and spikesPerTick = (float(rateVal) * (machineTimeStep / 1000000.0)) if spikesPerTick <= SLOW_RATE_PER_TICK_CUTOFF: slow_sources.append([i, rateVal, startVal, endVal]) else: fast_sources.append([i, spikesPerTick, startVal, endVal]) # Write the numbers of each type of source spec.write(data = len(slow_sources)) spec.write(data = len(fast_sources)) # Now write one struct for each slow source as follows # # typedef struct slow_spike_source_t # { # uint32_t neuron_id; # uint32_t start_ticks; # uint32_t end_ticks; # # accum mean_isi_ticks; # accum time_to_spike_ticks; # } slow_spike_source_t; for (neuronId, rateVal, startVal, endVal) in slow_sources: isiValScaled = int(float(1000000.0 / (rateVal * machineTimeStep)) * 32768.0) startScaled = int(startVal * 1000.0 / machineTimeStep) endScaled = int(endVal * 1000.0 / machineTimeStep) spec.write(data = neuronId, sizeof='uint32') spec.write(data = startScaled, sizeof='uint32') spec.write(data = endScaled, sizeof='uint32') spec.write(data = isiValScaled, sizeof='s1615') spec.write(data = 0x0, sizeof='uint32') # Now write # typedef struct fast_spike_source_t # { # uint32_t neuron_id; # uint32_t start_ticks; # uint32_t end_ticks; # # unsigned long fract exp_minus_lambda; # } fast_spike_source_t; for (neuronId, spikesPerTick, startVal, endVal) in fast_sources: exp_minus_lamda = exp(-1.0 * spikesPerTick) exp_minus_lamda_scaled = int(exp_minus_lamda * float(0xFFFFFFFF)) startScaled = int(startVal * 1000.0 / machineTimeStep) endScaled = int(endVal * 1000.0 / machineTimeStep) spec.write(data = neuronId, sizeof='uint32') spec.write(data = startScaled, sizeof='uint32') spec.write(data = endScaled, sizeof='uint32') spec.write(data = exp_minus_lamda_scaled, sizeof='u032') return
def writePoissonParameters(self, spec, machineTimeStep, processor, numNeurons): """ Generate Neuron Parameter data for Poisson spike sources (region 2): """ spec.comment("\nWriting Neuron Parameters for %d poisson sources:\n" % numNeurons) # Set the focus to the memory region 2 (neuron parameters): spec.switchWriteFocus(region=POISSON_PARAMS_REGION) # Write header info to the memory region: # Write Key info for this core: chipX, chipY, chipP = processor.get_coordinates() populationIdentity = \ packet_conversions.get_key_from_coords(chipX, chipY, chipP) spec.write(data=populationIdentity) # Write the random seed (4 words), generated randomly! if self.seed == None: spec.write(data=numpy.random.randint(0x7FFFFFFF)) spec.write(data=numpy.random.randint(0x7FFFFFFF)) spec.write(data=numpy.random.randint(0x7FFFFFFF)) spec.write(data=numpy.random.randint(0x7FFFFFFF)) else: spec.write(data=self.seed[0]) spec.write(data=self.seed[1]) spec.write(data=self.seed[2]) spec.write(data=self.seed[3]) # For each neuron, get the rate to work out if it is a slow # or fast source slow_sources = list() fast_sources = list() for i in range(0, numNeurons): # Get the parameter values for source i: rateVal = generateParameter(self.rate, i) startVal = generateParameter(self.start, i) endVal = generateParameter(self.duration, i) + startVal # Decide if it is a fast or slow source and spikesPerTick = (float(rateVal) * (machineTimeStep / 1000000.0)) if spikesPerTick <= SLOW_RATE_PER_TICK_CUTOFF: slow_sources.append([i, rateVal, startVal, endVal]) else: fast_sources.append([i, spikesPerTick, startVal, endVal]) # Write the numbers of each type of source spec.write(data=len(slow_sources)) spec.write(data=len(fast_sources)) # Now write one struct for each slow source as follows # # typedef struct slow_spike_source_t # { # uint32_t neuron_id; # uint32_t start_ticks; # uint32_t end_ticks; # # accum mean_isi_ticks; # accum time_to_spike_ticks; # } slow_spike_source_t; for (neuronId, rateVal, startVal, endVal) in slow_sources: isiValScaled = int( float(1000000.0 / (rateVal * machineTimeStep)) * 32768.0) startScaled = int(startVal * 1000.0 / machineTimeStep) endScaled = int(endVal * 1000.0 / machineTimeStep) spec.write(data=neuronId, sizeof='uint32') spec.write(data=startScaled, sizeof='uint32') spec.write(data=endScaled, sizeof='uint32') spec.write(data=isiValScaled, sizeof='s1615') spec.write(data=0x0, sizeof='uint32') # Now write # typedef struct fast_spike_source_t # { # uint32_t neuron_id; # uint32_t start_ticks; # uint32_t end_ticks; # # unsigned long fract exp_minus_lambda; # } fast_spike_source_t; for (neuronId, spikesPerTick, startVal, endVal) in fast_sources: exp_minus_lamda = exp(-1.0 * spikesPerTick) exp_minus_lamda_scaled = int(exp_minus_lamda * float(0xFFFFFFFF)) startScaled = int(startVal * 1000.0 / machineTimeStep) endScaled = int(endVal * 1000.0 / machineTimeStep) spec.write(data=neuronId, sizeof='uint32') spec.write(data=startScaled, sizeof='uint32') spec.write(data=endScaled, sizeof='uint32') spec.write(data=exp_minus_lamda_scaled, sizeof='u032') return