コード例 #1
0
ファイル: state.py プロジェクト: sunu/oppia-test
    def transition(self, answer, params, interactive_widget_properties):
        """Handle feedback interactions with readers."""

        dest_id = None
        feedback = None
        recorded_answer = answer

        if interactive_widget_properties['classifier']:
            # Import the relevant classifier module.
            classifier_module = '.'.join([
                feconf.SAMPLE_CLASSIFIERS_DIR.replace('/', '.'),
                interactive_widget_properties['classifier'],
                interactive_widget_properties['classifier']])
            Classifier = importlib.import_module(classifier_module)
            logging.info(Classifier.__name__)

            norm_answer = Classifier.DEFAULT_NORMALIZER().normalize(answer)
            if norm_answer is None:
                raise Exception(
                    'Invalid input: could not normalize the answer.')

        answer_handler = None
        for handler in self.widget.handlers:
            if handler.name == 'submit':
                answer_handler = handler

        for ind, rule in enumerate(answer_handler.rules):
            if ind == len(answer_handler.rules) - 1:
                # TODO(sll): This is a special case for multiple-choice input
                # which should really be handled generically. However, it's
                # not very interesting anyway because the reader's answer
                # in this case is already known (it's just the last of the
                # multiple-choice options given).
                if self.widget.widget_id == 'MultipleChoiceInput':
                    recorded_answer = (
                        self.widget.params['choices'][int(answer)])

            if rule.name == 'Default':
                dest_id = rule.dest
                feedback = (utils.get_random_choice(rule.feedback)
                            if rule.feedback else '')
                break

            func_name, param_list = self.get_classifier_info(
                self.widget.widget_id, handler.name, rule, params)
            param_list = [norm_answer] + param_list
            classifier_output = getattr(Classifier, func_name)(*param_list)

            return_value, unused_return_data = (
                utils.normalize_classifier_return(classifier_output))

            if return_value:
                dest_id = rule.dest
                feedback = (utils.get_random_choice(rule.feedback)
                            if rule.feedback else '')
                break

        return dest_id, feedback, rule, recorded_answer
コード例 #2
0
ファイル: models.py プロジェクト: sunu/oppia-test-2
    def transition(self, answer, params, handler):
        """Handle feedback interactions with readers."""

        recorded_answer = answer

        answer_handler = None
        for wi_handler in self.widget.handlers:
            if wi_handler.name == handler:
                answer_handler = wi_handler

        if answer_handler.classifier:
            # Import the relevant classifier module.
            classifier_module = '.'.join([
                feconf.SAMPLE_CLASSIFIERS_DIR.replace('/', '.'),
                answer_handler.classifier, answer_handler.classifier])
            Classifier = importlib.import_module(classifier_module)
            logging.info(Classifier.__name__)

            norm_answer = Classifier.DEFAULT_NORMALIZER().normalize(answer)
            if norm_answer is None:
                raise Exception('Could not normalize %s.' % answer)

        # TODO(sll): This is a special case for multiple-choice input
        # which should really be handled generically.
        if self.widget.widget_id == 'MultipleChoiceInput':
            recorded_answer = self.widget.params['choices'][int(answer)]

        selected_rule = None

        for ind, rule in enumerate(answer_handler.rules):
            if rule.name == 'Default':
                selected_rule = rule
                break

            func_name, param_list = self.get_classifier_info(
                self.widget.widget_id, answer_handler.name, rule, params)
            param_list = [norm_answer] + param_list
            classifier_output = getattr(Classifier, func_name)(*param_list)

            match, _ = utils.normalize_classifier_return(classifier_output)

            if match:
                selected_rule = rule
                break

        feedback = (utils.get_random_choice(selected_rule.feedback)
                    if selected_rule.feedback else '')
        return selected_rule.dest, feedback, rule, recorded_answer
コード例 #3
0
ファイル: models.py プロジェクト: sunu/oppia-test-4
    def find_first_match(self, handler, Classifier, norm_answer, params):
        for ind, rule in enumerate(handler.rules):
            if rule.name == 'Default':
                return rule

            func_name, param_list = self.get_classifier_info(
                self.widget.widget_id, handler.name, rule, params)
            param_list = [norm_answer] + param_list
            classifier_output = getattr(Classifier, func_name)(*param_list)

            match, _ = utils.normalize_classifier_return(classifier_output)

            if match:
                return rule

        raise Exception('No matching rule found for handler %s.' % handler.name)
コード例 #4
0
ファイル: utils_test.py プロジェクト: sunu/oppia-test-2
    def test_normalize_classifier_return(self):
        """Test normalize_classifier_return method."""
        with self.assertRaises(utils.InvalidInputException):
            utils.normalize_classifier_return()
        with self.assertRaises(utils.InvalidInputException):
            utils.normalize_classifier_return(1, 2, 3)
        with self.assertRaises(AssertionError):
            utils.normalize_classifier_return(1)
        with self.assertRaises(AssertionError):
            utils.normalize_classifier_return(1, {'a': 'b'})
        with self.assertRaises(AssertionError):
            utils.normalize_classifier_return(True, 2)

        self.assertEqual(
            utils.normalize_classifier_return(True), (True, {}))
        self.assertEqual(
            utils.normalize_classifier_return(False), (False, {}))
        self.assertEqual(
            utils.normalize_classifier_return(
                False, {'a': 'b'}), (False, {'a': 'b'}))