コード例 #1
0
ファイル: test_tf_ok.py プロジェクト: hmsgit/nrpcle
    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)
コード例 #2
0
ファイル: ROSCLEServer.py プロジェクト: dcam0050/NRP_Docker
    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)
コード例 #3
0
ファイル: ROSCLEServer.py プロジェクト: dcam0050/NRP_Docker
    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
        ])
コード例 #4
0
ファイル: ROSCLEServer.py プロジェクト: dcam0050/NRP_Docker
    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
コード例 #5
0
ファイル: test_tf_ok.py プロジェクト: hmsgit/nrpcle
    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))
コード例 #6
0
ファイル: test_tf_ok.py プロジェクト: hmsgit/nrpcle
    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)