def execute(self, argv) : i = 1 while len(argv) > i : if argv[i] == "-help" : # skip handled is BrainStudioBE.py i=i+1 continue elif argv[i] == "-controller" and len(argv) > i+1 : # skip handled is BrainStudioBE.py i+=2 continue elif argv[i] == "-nogui" : self.no_sockets = True print('NOGUI......') elif argv[i] == "-file" and len(argv) > i+1 : i+=1 self.filename = argv[i] elif argv[i] == "-port" and len(argv) > i+1 : i+=1 self.port = int(argv[i]) elif argv[i] == "-ip" and len(argv) > i+1 : i+=1 self.ip = str(argv[i]) else : print "Argument '" + argv[i] + "' not recognized. Please type python",\ "BrainStudioBE.py -help." exit() i+=1 if self.no_sockets : print "Starting simulation without GUI.." self.sim = brain() self.spikes = [] try: self.sim.load_from_brn('./brn/' + self.filename) self.exp_start = time() while not self.sim.stopped : self.spikes = self.sim.run() sleep(self.sim.speed/1000.0) print "End. Duration:", time() - self.exp_start except BSException as e: errorin = 'Error in ' + e.get_where() print errorin print e.get_what() exit() else: self.start_server() self.listen()
def execute(self, argv): i = 1 while len(argv) > i: if argv[i] == "-help": # skip handled is BrainStudioBE.py i = i + 1 continue elif argv[i] == "-controller" and len(argv) > i + 1: # skip handled is BrainStudioBE.py i += 2 continue elif argv[i] == "-file" and len(argv) > i + 1: i += 1 self.filename = argv[i] elif argv[i] == "-port" and len(argv) > i + 1: i += 1 self.port = int(argv[i]) elif argv[i] == "-ip" and len(argv) > i + 1: i += 1 self.ip = str(argv[i]) else: print "Argument '" + argv[i] + "' not recognized. Please type python", "BrainStudioBE.py -help." exit() i += 1 print "Creating simulator" self.sim = brain() if len(self.filename) > 0: try: self.sim.load_from_brn("./brn/" + self.filename) except BSException as e: errorin = "Error in " + e.get_where() print errorin print e.get_what() exit() self.start_server() while self.block_for_exit.locked(): pass
def clear_sim(self, client_id, respawn=True): # MUTEX HERE self.block_for_local.acquire() if self.master != client_id: # MUTEX HERE self.block_for_local.release() return self.master self.paused = True print "Deleting simulator" del self.sim self.sim = 0 if respawn: print "Creating simulator" self.sim = brain() self.timestep = 0 self.filename = "" # MUTEX HERE self.block_for_client.acquire() for c in self.clients: if c[1] != self.master: c[0].sendall("killed") c[3] = True # MUTEX HERE self.block_for_client.release() # MUTEX HERE self.block_for_local.release() return -1
def local_initialize(self, ip="localhost", port=10000): self.ip = ip self.port = port self.sim = brain() self.start_server()
def listen(self) : # -- Backend --------------------------------------------------------------- spikes = [] # -------------------------------------------------------------------------- # Listen for incoming connections self.sock.listen(5) paused = True recieving_file = False timestep = 0.0 exp_start = time() while True: # Wait for a connection print >>stderr, 'waiting for a connection' connection, client_address = self.sock.accept() try: print >>stderr, 'New connection from', client_address connection.sendall("OK!!") # Start a new nemo simulation with brain() as sim : # Receive the data in small chunks and retransmit it while True: #print "ZAF:",connection data = connection.recv(4096) # It was 16 if data: print 'Client:', data # -- RECIEVING FILE ------------------------------------ if recieving_file : if data == "end" : recieving_file = False print "File ended. Saving.." # Saving file.. self.brn_file.close() print "Loading file.." # Loading file.. try: sim.load_from_brn('./brn/' + self.filename) except BSException as e: errorin = 'Error in ' + e.get_where() print errorin print e.get_what() reply = dict() reply['where'] = errorin reply['what'] = e.get_what() connection.sendall("error " + json.dumps(reply) ) break connection.sendall("file loaded "+\ str(sim.get_size())) else : #print "Adding to file:\t", data self.brn_file.write(data) connection.sendall("give me") # more.. # ------------------------------------------------------ # Format: step <number> spikes <indices> speed <int_in_ms> stim <indices> <current> action <JSON> if data[:4] == "step" and not paused: command = data.split() # TODO: Now we rely on the assumption that the messages always follow the order # mentioned above. It would be safer to check every part of the string try: timestep = float(command[1]) I_stim = [] speed = 0 if len(command) >= 6 : speed = int(command[5]) idx = 6 # See if the GUI is sending any stimulation while len(command) >= (idx+2) and command[idx] == 'stim': if command[idx+1][0] == '-': what = "Stim neuron is negative: "+ command[7] errorin = 'Error in DefaultController' print errorin print what reply = dict() reply['where'] = errorin reply['what'] = what connection.sendall("error " + json.dumps(reply) ) break stim_a = int(command[idx+1].split('-')[0]) stim_b = int(command[idx+1].split('-')[1]) stim_current = float(command[idx+2]) I_stim += [ (indx, stim_current) for indx in range(stim_a, stim_b) ] idx += 3 # See if the GUI is sending any stimulation while len(command) >= (idx+1) and command[idx] == 'action': action = json.loads(command[idx+1].replace('+', ' ')) action['t'] = timestep sim.add_action_dict(action) idx += 2 print "Timestep:", timestep # Simulation here .......... try: spikes = sim.run(I_stim=I_stim) rates = sim.get_rates() except BSException as e: errorin = 'Error in ' + e.get_where() print errorin print e.get_what() reply = dict() reply['where'] = errorin reply['what'] = e.get_what() connection.sendall("error " + json.dumps(reply) ) break # .......................... # If the execution of run() found an action that # requires the simulation to pause, inform the # controller.. if sim.stopped : print "Simulation stopped. Duration:", time() - self.exp_start timestep = -1.0 paused = True # Do not send any message! continue if speed > 0 : sleep(speed/1000.0) timestep += 1.0 message_to_send = "done "+str(timestep) com = command if com.count('spikes') > 0 : com = com[com.index('spikes'):] if len(com) > 1 and com[1] == "all" : # Delete first and last element, i.e.'[' and ']' str_spikes = ','.join(str(x) for x in spikes) str_rates = ','.join(str(e) for e in rates[0])+' '+','.join(str(e) for e in rates[1]) message_to_send += " spikes " + str_spikes + " end_spikes" + \ " rates " + str_rates + " end_rates" com = command while com.count('get_state') > 0 and len(com[com.index('get_state'):]) > 2: com = com[com.index('get_state'):] node_name = com[1].replace('+', ' ') # Get the state! state_name = com[2] states = sim.get_node_states_by_name(node_name, state_name) str_states = ','.join(str(x) for x in states) node_start = sim.get_node_first_neuron(node_name) node_end = node_start + sim.get_node_size(node_name) message_to_send += " state " + com[1] + " " + state_name + " " message_to_send += str(node_start) + "-" + str(node_end) + " " message_to_send += str_states + " end_state" com = com[3:] connection.sendall(message_to_send) except ValueError: what = "Step not a float: "+ command[1] errorin = 'Error in DefaultController' print errorin print what reply = dict() reply['where'] = errorin reply['what'] = what connection.sendall("error " + json.dumps(reply) ) break elif data[:5] == "pause" : print "Pausing.. Duration:", time() - self.exp_start paused = True elif data[:4] == "play": print "Starting.." paused = False sim.stopped = False connection.sendall("done "+str(timestep)) self.exp_start = time() elif data == "get nodes" : print "Sending nodes.." my_nodes = sim.get_instantiatable_nodes() reply = dict() for node in my_nodes : params, states, default_params, default_states = my_nodes[node][1] fields = my_nodes[node][2] version = my_nodes[node][3] model = my_nodes[node][5] inputfield = my_nodes[node][6] outputfield = my_nodes[node][7] unitsfield = my_nodes[node][8] reply[node] = dict() reply[node]['fields'] = fields reply[node]['params'] = params reply[node]['states'] = states reply[node]['default_params'] = default_params reply[node]['default_states'] = default_states reply[node]['model'] = model reply[node]['input_field'] = inputfield reply[node]['output_field'] = outputfield reply[node]['units_field'] = unitsfield reply[node]['version'] = version connection.sendall("nodes " + json.dumps(reply) + "nodes end") elif data == "get edges" : print "Sending edges.." my_edges = sim.get_instantiatable_edges() reply = dict() for edge in my_edges : params, states, default_params, default_states = my_edges[edge][1] fields = my_edges[edge][2] version = my_edges[edge][3] inputmodel = my_edges[edge][5] outputmodel = my_edges[edge][6] reply[edge] = dict() reply[edge]['fields'] = fields reply[edge]['params'] = params reply[edge]['states'] = states reply[edge]['default_params'] = default_params reply[edge]['default_states'] = default_states reply[edge]['input_model'] = inputmodel reply[edge]['output_model'] = outputmodel reply[edge]['version'] = version connection.sendall("edges " + json.dumps(reply) + 'edges end' ) elif data[:4] == "node" : index = int(data[4:-1]) data = sim.get_node_data(index) if sim.get_model_type(index == 'spike'): str_spikes = ','.join(str(x) for x in data) connection.sendall("spikes " + str_spikes + " done" ) elif sim.get_model_type(index == 'rate'): all_rates = '' for d in data: str_rates = '[' str_rates += ','.join(str(x) for x in d) str_rates += ']' all_rates+=str_rates connection.sendall("rates " + all_rates + " done" ) else : connection.sendall("done") elif data[:4] == "edge" : data = sim.get_edge_data(int(data[4:-1])) all_weights = '' for d in data: str_weights= '[' str_weights += ','.join(str(x) for x in d) str_weights += ']' all_weights+=str_weights connection.sendall("weights " + all_weights + " done" ) elif data == "sending file" and paused : print "Start recieving brn file.." # In case of having already a simulation running, one # option would be to resume simulation, and then I would # just need to return the following msg: #if sim.neurons > 0 :# Already have a simulation running # connection.sendall("already running "+\ # str(sim.net.neuron_count())) #else : # recieving_file = True # brn_file = open('simulation.brn', 'w') # connection.sendall("give me") # However here I will just reinitialize the network: if sim.neurons > 0 : # Already have a simulation running print "Error: Sim neurons:", sim.neurons exit() recieving_file = True self.brn_file = open('./brn/' + 'simulation.brn', 'w') connection.sendall("give me") else: print "Connection with", client_address, "terminated" break """ print >>stderr, 'received "%s"' % data if data: print >>stderr, 'sending data back to the client' connection.sendall(data) else: print >>stderr, 'no more data from', client_address break """ finally: #Clean up the connection paused = True connection.close()