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
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
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)
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'}))