def test_tf_delete(self, mock_cleanup): nrp.start_new_tf_manager() brain = MockBrainCommunicationAdapter() robot = MockRobotCommunicationAdapter() config.active_node.brain_adapter = brain nrp.set_nest_adapter(brain) nrp.set_robot_adapter(robot) @nrp.MapCSVRecorder("recorder1", filename = "1", headers=["Name", "time", "Position"]) @nrp.MapSpikeSink("neuron0", nrp.brain.actors[slice(0, 2, 1)], nrp.leaky_integrator_alpha, v_rest=1.0, updates=[(1.0, 0.3)]) @nrp.Neuron2Robot(Husky.RightArm.pose) def right_arm(t, neuron0, recorder1): return neuron0.voltage * 1.345 @nrp.MapCSVRecorder("recorder2", filename = "2", headers=["Name", "time", "Position"]) @nrp.MapSpikeSink("neuron1", nrp.brain.actors[slice(2, 4, 1)], nrp.leaky_integrator_alpha, updates=[(1.0, 0.4)], v_rest=1.0) @nrp.MapSpikeSink("neuron2", nrp.brain.actors[slice(4, 6, 1)], nrp.leaky_integrator_alpha, updates=[(1.0, 0.4)], v_rest=1.0) @nrp.Neuron2Robot(Husky.LeftArm.twist) def left_arm_tw(t, neuron1, neuron2, recorder2): if neuron1.voltage < 0.678: if neuron2.voltage > 0.345: return 0.756 else: return 1.123 else: if neuron2.voltage < 0.789: return 0.632 else: return 0.256 nrp.initialize("MyTransferFunctions") # Delete an existing transfer function self.assertEqual(2, len(nrp.get_transfer_functions())) self.assertEqual(True, nrp.delete_transfer_function("left_arm_tw")) self.assertEqual(1, len(nrp.get_transfer_functions())) self.assertEqual(mock_cleanup.call_count, 1) # Try to delete it again self.assertEqual(False, nrp.delete_transfer_function("left_arm_tw")) self.assertEqual(1, len(nrp.get_transfer_functions())) # Delete another existing transfer function self.assertEqual(True, nrp.delete_transfer_function("right_arm")) self.assertEqual(0, len(nrp.get_transfer_functions())) self.assertEqual(0, len(config.active_node.brain_adapter.detector_devices)) self.assertEqual(mock_cleanup.call_count, 2)
def __get_transfer_function_sources_and_activation(self, request, send_errors=True): """ Return the source code of the transfer functions and its activity state in a tuple of parallel lists. :param request: The mandatory rospy request parameter :param send_errors: when available, send error messages on the cle_error topic :return A tuple (tf_sources, tf_activation_state) """ tfs = tf_framework.get_transfer_functions() tf_arr = [] arr_active_mask = [] for tf in tfs: tf_arr.append(tf.source.encode('UTF-8')) arr_active_mask.append(tf.active) if send_errors and hasattr( tf, 'error'): # tf may not have an error member self._publish_error_from_exception(tf.error, tf.name) return numpy.array(tf_arr), numpy.array(arr_active_mask)
def __get_structured_transfer_functions(request): """ Return the source code of the transfer functions :param request: The mandatory rospy request parameter """ tfs = tf_framework.get_transfer_functions(flawed=False) return srv.GetStructuredTransferFunctionsResponse([ tf for tf in map(StructuredTransferFunction.extract_structure, tfs) if tf is not None ])
def __check_set_brain(self, data_type, brain_populations, change_population): """ Checks whether the given brain change request is valid :param data_type: The data type :param brain_populations: The brain populations :param change_population: A flag indicating whether populations should be changed :return: None in case everything is alright, otherwise an error tuple """ if data_type != "text" and data_type != "base64": return ["Data type {0} is invalid".format(data_type), 0, 0, 0] new_populations = [ str(item) for item in json.loads(brain_populations).keys() ] old_populations = [ str(item) for item in tf_framework.get_brain_populations().keys() ] old_changed = find_changed_strings(old_populations, new_populations) new_added = find_changed_strings(new_populations, old_populations) if len(new_added) == len(old_changed) >= 1: transfer_functions = tf_framework.get_transfer_functions( flawed=False) check_var_name_re = re.compile(r'^([a-zA-Z_]+\w*)$') for item in new_added: if not check_var_name_re.match(item): return [ "Provided name \"" + item + "\" is not a valid population name", 0, 0, 0 ] return self.change_transfer_functions(change_population, old_changed, new_added, transfer_functions) elif old_changed and len(new_added) > len(old_changed): return [ "Renamed populations must be applied separately. Please apply the renaming " + "before proceeding with other changes.", -2, -2, 0 ] return None
def test_tf_source(self): nrp.start_new_tf_manager() brain = MockBrainCommunicationAdapter() robot = MockRobotCommunicationAdapter() @nrp.MapSpikeSink("neuron0", nrp.brain.actors[slice(0, 2, 1)], nrp.leaky_integrator_alpha, v_rest=1.0, updates=[(1.0, 0.3)]) @nrp.Neuron2Robot(Husky.RightArm.pose) def right_arm(t, neuron0): return neuron0.voltage * 1.345 @nrp.Robot2Neuron() def transform_camera(t, camera, camera_device): if camera.changed: camera_device.inner.amplitude = 42.0 expected_source_n2r = """@nrp.MapSpikeSink("neuron0", nrp.brain.actors[slice(0, 2, 1)], nrp.leaky_integrator_alpha, v_rest=1.0, updates=[(1.0, 0.3)]) @nrp.Neuron2Robot(Husky.RightArm.pose) def right_arm(t, neuron0): return neuron0.voltage * 1.345 """ expected_source_r2n = """@nrp.Robot2Neuron() def transform_camera(t, camera, camera_device): if camera.changed: camera_device.inner.amplitude = 42.0 """ loaded_source_n2r = config.active_node.n2r[0].source self.assertEqual(loaded_source_n2r, expected_source_n2r) loaded_source_r2n = config.active_node.r2n[0].source self.assertEqual(loaded_source_r2n, expected_source_r2n) loaded_source_n2r_and_r2n = [tf.source for tf in nrp.get_transfer_functions()] self.assertIn(expected_source_n2r, loaded_source_n2r_and_r2n) self.assertIn(expected_source_r2n, loaded_source_n2r_and_r2n) self.assertEqual(2, len(loaded_source_n2r_and_r2n))
def test_tf_set(self): nrp.start_new_tf_manager() brain = MockBrainCommunicationAdapter() robot = MockRobotCommunicationAdapter() config.active_node.brain_adapter = brain config.active_node.robot_adapter = robot config.active_node.initialize_tf = MagicMock(return_value=None) @nrp.MapSpikeSink("neuron0", nrp.brain.actors[slice(0, 2, 1)], nrp.leaky_integrator_alpha, v_rest=1.0, updates=[(1.0, 0.3)] ) @nrp.Neuron2Robot(Husky.RightArm.pose) def right_arm(t, neuron0): return neuron0.voltage * 1.345 @nrp.Robot2Neuron() def transform_camera(t, camera, camera_device): if camera.changed: camera_device.inner.amplitude = 42.0 tf_n2r = """@nrp.MapSpikeSink("neuron1", nrp.brain.actors[slice(0, 2, 1)], nrp.leaky_integrator_alpha, v_rest=1.0, updates=[(3.0, 0.1)]) @nrp.Neuron2Robot() def right_arm(t, neuron1): return neuron1.voltage * 2.345 """ tf_r2n = """@nrp.MapRobotSubscriber("camera", Topic('/husky/camera', sensor_msgs.msg.Image)) @nrp.Robot2Neuron() def transform_camera(t, camera): if camera.changed: pass """ nrp.delete_transfer_function('right_arm') nrp.delete_transfer_function('transform_camera') nrp.set_transfer_function(tf_n2r, tf_n2r, 'right_arm') nrp.set_transfer_function(tf_r2n, tf_r2n, 'transform_camera') self.assertEqual(config.active_node.initialize_tf.call_count, 2) loaded_source_n2r_and_r2n = [tf.source for tf in nrp.get_transfer_functions()] self.assertIn(tf_n2r, loaded_source_n2r_and_r2n) self.assertIn(tf_r2n, loaded_source_n2r_and_r2n) number_of_tf = len(loaded_source_n2r_and_r2n) self.assertEqual(2, number_of_tf) source_update_flags = [tf.updated for tf in nrp.get_transfer_functions()] self.assertEqual([True] * number_of_tf, source_update_flags) fancy_tf = "def it_wont_work():\n return None" self.assertRaises(TFLoadingException, nrp.set_transfer_function, fancy_tf, fancy_tf, "it_wont_work") try: nrp.set_transfer_function(fancy_tf, fancy_tf, 'it_wont_work') except TFLoadingException as e: self.assertIn('no decorator', e.message) self.assertEqual('it_wont_work', e.tf_name) funny_tf = """@nrp.Robot2Neuron() def transform_camera(t, camera, camera_device): if camera.changed: return Nothing! """ self.assertRaises(TFLoadingException, nrp.set_transfer_function, funny_tf, funny_tf, "it_cant_work") try: nrp.set_transfer_function(funny_tf, funny_tf, 'it_cant_work') except TFLoadingException as e: self.assertIn('invalid syntax', e.message) self.assertIn('line 4', e.message) self.assertEqual('it_cant_work', e.tf_name)