def test_get_training_data(self): """Test retrieval of training data.""" exploration_id = 'eid' test_exp_filepath = os.path.join(feconf.SAMPLE_EXPLORATIONS_DIR, 'classifier_demo_exploration.yaml') yaml_content = utils.get_file_contents(test_exp_filepath) assets_list = [] exp_services.save_new_exploration_from_yaml_and_assets( feconf.SYSTEM_COMMITTER_ID, yaml_content, exploration_id, assets_list) exploration = exp_services.get_exploration_by_id(exploration_id) state = exploration.states['text'] expected_training_data = [{ 'answer_group_index': 1, 'answers': [ u'cheerful', u'merry', u'ecstatic', u'glad', u'overjoyed', u'pleased', u'thrilled', u'smile' ] }] observed_training_data = state.get_training_data() self.assertEqual(observed_training_data, expected_training_data)
def _init_classify_inputs(self, exploration_id): test_exp_filepath = os.path.join(feconf.TESTS_DATA_DIR, "string_classifier_test.yaml") yaml_content = utils.get_file_contents(test_exp_filepath) assets_list = [] exp_services.save_new_exploration_from_yaml_and_assets( feconf.SYSTEM_COMMITTER_ID, yaml_content, exploration_id, assets_list ) self.exp_id = exploration_id self.exp_state = exp_services.get_exploration_by_id(exploration_id).states["Home"]
def _init_classify_inputs(self, exploration_id): test_exp_filepath = os.path.join(feconf.TESTS_DATA_DIR, 'string_classifier_test.yaml') yaml_content = utils.get_file_contents(test_exp_filepath) assets_list = [] exp_services.save_new_exploration_from_yaml_and_assets( feconf.SYSTEM_COMMITTER_ID, yaml_content, 'Testing String Classifier', 'Test', exploration_id, assets_list) self.exp_id = exploration_id self.exp_state = ( exp_services.get_exploration_by_id(exploration_id).states['Home'])
def post(self): """Handles POST requests.""" yaml_content = self.request.get('yaml_file') new_exploration_id = exp_services.get_new_exploration_id() if feconf.ALLOW_YAML_FILE_UPLOAD: exp_services.save_new_exploration_from_yaml_and_assets( self.user_id, yaml_content, new_exploration_id, []) self.render_json({EXPLORATION_ID_KEY: new_exploration_id}) else: raise self.InvalidInputException( 'This server does not allow file uploads.')
def _init_classify_inputs(self, exploration_id): test_exp_filepath = os.path.join( feconf.TESTS_DATA_DIR, 'string_classifier_test.yaml') yaml_content = utils.get_file_contents(test_exp_filepath) assets_list = [] exp_services.save_new_exploration_from_yaml_and_assets( feconf.SYSTEM_COMMITTER_ID, yaml_content, 'Testing String Classifier', 'Test', exploration_id, assets_list) self.EXP_ID = exploration_id self.EXP_STATE = ( exp_services.get_exploration_by_id(exploration_id).states['Home'])
def _init_classify_inputs(self, exploration_id): test_exp_filepath = os.path.join(feconf.TESTS_DATA_DIR, 'string_classifier_test.yaml') yaml_content = utils.get_file_contents(test_exp_filepath) assets_list = [] with self.swap(feconf, 'ENABLE_ML_CLASSIFIERS', True): exp_services.save_new_exploration_from_yaml_and_assets( feconf.SYSTEM_COMMITTER_ID, yaml_content, exploration_id, assets_list) self.exp_id = exploration_id self.exp_state = ( exp_services.get_exploration_by_id(exploration_id).states['Home'])
def post(self): """Handles POST requests.""" yaml_content = self.request.get('yaml_file') new_exploration_id = exp_services.get_new_exploration_id() if feconf.ALLOW_YAML_FILE_UPLOAD: exp_services.save_new_exploration_from_yaml_and_assets( self.user_id, yaml_content, new_exploration_id, []) self.render_json({ EXPLORATION_ID_KEY: new_exploration_id }) else: raise self.InvalidInputException( 'This server does not allow file uploads.')
def post(self): """Handles POST requests.""" yaml_content = self.normalized_payload.get('yaml_file') new_exploration_id = exp_fetchers.get_new_exploration_id() if constants.ALLOW_YAML_FILE_UPLOAD: exp_services.save_new_exploration_from_yaml_and_assets( self.user_id, yaml_content, new_exploration_id, [], strip_voiceovers=True) self.render_json({EXPLORATION_ID_KEY: new_exploration_id}) else: raise self.InvalidInputException( 'This server does not allow file uploads.')
def _init_classify_inputs(self, exploration_id: str) -> None: """Initializes all the classification inputs of the exploration corresponding to the given exploration id. """ test_exp_filepath = os.path.join(feconf.TESTS_DATA_DIR, 'string_classifier_test.yaml') yaml_content = utils.get_file_contents(test_exp_filepath) assets_list: List[str] = [] with self.swap(feconf, 'ENABLE_ML_CLASSIFIERS', True): exp_services.save_new_exploration_from_yaml_and_assets( # type: ignore[no-untyped-call] feconf.SYSTEM_COMMITTER_ID, yaml_content, exploration_id, assets_list) self.exp_id = exploration_id self.exp_state = ( exp_fetchers.get_exploration_by_id(exploration_id).states['Home'])
def setUp(self): super(GenerateV1StatisticsJobTest, self).setUp() self.exp_id = 'exp_id' test_exp_filepath = os.path.join(feconf.TESTS_DATA_DIR, 'string_classifier_test.yaml') yaml_content = utils.get_file_contents(test_exp_filepath) assets_list = [] exp_services.save_new_exploration_from_yaml_and_assets( feconf.SYSTEM_COMMITTER_ID, yaml_content, self.exp_id, assets_list) self.exploration = exp_services.get_exploration_by_id(self.exp_id) # Create event models for version 1 of the exploration. stats_models.StartExplorationEventLogEntryModel.create( self.exp_id, self.exploration.version, 'Home', 'session_id1', {}, feconf.PLAY_TYPE_NORMAL) stats_models.StartExplorationEventLogEntryModel.create( self.exp_id, self.exploration.version, 'Home', 'session_id2', {}, feconf.PLAY_TYPE_NORMAL) stats_models.StateHitEventLogEntryModel.create( self.exp_id, self.exploration.version, 'Home', 'session_id1', {}, feconf.PLAY_TYPE_NORMAL) stats_models.StateHitEventLogEntryModel.create( self.exp_id, self.exploration.version, 'Home', 'session_id2', {}, feconf.PLAY_TYPE_NORMAL) stats_models.StateHitEventLogEntryModel.create( self.exp_id, self.exploration.version, 'Home', 'session_id2', {}, feconf.PLAY_TYPE_NORMAL) stats_models.StateHitEventLogEntryModel.create( self.exp_id, self.exploration.version, 'End', 'session_id2', {}, feconf.PLAY_TYPE_NORMAL) stats_models.CompleteExplorationEventLogEntryModel.create( self.exp_id, self.exploration.version, 'End', 'session_id2', 10, {}, feconf.PLAY_TYPE_NORMAL) event_services.AnswerSubmissionEventHandler.record( self.exp_id, self.exploration.version, 'Home', 'TextInput', 0, 0, exp_domain.EXPLICIT_CLASSIFICATION, 'session_id2', 0, {}, 'answer1') event_services.AnswerSubmissionEventHandler.record( self.exp_id, self.exploration.version, 'Home', 'TextInput', 0, 0, exp_domain.DEFAULT_OUTCOME_CLASSIFICATION, 'session_id2', 0, {}, 'answer2')
def post(self): """Handles POST requests.""" title = self.payload.get('title') category = self.payload.get('category') yaml_content = self.request.get('yaml_file') if not title: raise self.InvalidInputException('No title supplied.') if not category: raise self.InvalidInputException('No category chosen.') new_exploration_id = exp_services.get_new_exploration_id() if ALLOW_YAML_FILE_UPLOAD.value: exp_services.save_new_exploration_from_yaml_and_assets( self.user_id, yaml_content, title, category, new_exploration_id, []) self.render_json({EXPLORATION_ID_KEY: new_exploration_id}) else: raise self.InvalidInputException( 'This server does not allow file uploads.')
def test_can_undergo_classification(self): """Test the can_undergo_classification() function.""" exploration_id = 'eid' test_exp_filepath = os.path.join(feconf.TESTS_DATA_DIR, 'string_classifier_test.yaml') yaml_content = utils.get_file_contents(test_exp_filepath) assets_list = [] exp_services.save_new_exploration_from_yaml_and_assets( feconf.SYSTEM_COMMITTER_ID, yaml_content, exploration_id, assets_list) exploration = exp_services.get_exploration_by_id(exploration_id) state_with_training_data = exploration.states['Home'] state_without_training_data = exploration.states['End'] # A state with 786 training examples. self.assertTrue(state_with_training_data.can_undergo_classification()) # A state with no training examples. self.assertFalse( state_without_training_data.can_undergo_classification())
def setUp(self): super(TrainedClassifierHandlerTest, self).setUp() self.exp_id = 'exp_id1' self.title = 'Testing Classifier storing' self.category = 'Test' yaml_path = os.path.join( feconf.TESTS_DATA_DIR, 'string_classifier_test.yaml') with open(yaml_path, 'r') as yaml_file: self.yaml_content = yaml_file.read() self.signup(self.ADMIN_EMAIL, self.ADMIN_USERNAME) self.signup('*****@*****.**', 'mod') assets_list = [] with self.swap(feconf, 'ENABLE_ML_CLASSIFIERS', True): exp_services.save_new_exploration_from_yaml_and_assets( feconf.SYSTEM_COMMITTER_ID, self.yaml_content, self.exp_id, assets_list) self.exploration = exp_services.get_exploration_by_id(self.exp_id) self.classifier_data_with_floats_stringified = { '_alpha': '0.1', '_beta': '0.001', '_prediction_threshold': '0.5', '_training_iterations': 25, '_prediction_iterations': 5, '_num_labels': 10, '_num_docs': 12, '_num_words': 20, '_label_to_id': {'text': 1}, '_word_to_id': {'hello': 2}, '_w_dp': [], '_b_dl': [], '_l_dp': [], '_c_dl': [], '_c_lw': [], '_c_l': [], } classifier_training_jobs = ( classifier_services.get_classifier_training_jobs( self.exp_id, self.exploration.version, ['Home'])) self.assertEqual(len(classifier_training_jobs), 1) classifier_training_job = classifier_training_jobs[0] self.job_id = classifier_training_job.job_id # TODO(pranavsid98): Replace the three commands below with # mark_training_job_pending after Giritheja's PR gets merged. classifier_training_job_model = ( classifier_models.ClassifierTrainingJobModel.get( self.job_id, strict=False)) classifier_training_job_model.status = ( feconf.TRAINING_JOB_STATUS_PENDING) classifier_training_job_model.put() self.job_result_dict = { 'job_id': self.job_id, 'classifier_data_with_floats_stringified': ( self.classifier_data_with_floats_stringified) } self.payload = {} self.payload['vm_id'] = feconf.DEFAULT_VM_ID self.payload['message'] = self.job_result_dict secret = feconf.DEFAULT_VM_SHARED_SECRET self.payload['signature'] = classifier.generate_signature( secret, self.payload['message'])
def setUp(self): super(TrainedClassifierHandlerTests, self).setUp() self.exp_id = 'exp_id1' self.title = 'Testing Classifier storing' self.category = 'Test' yaml_path = os.path.join(feconf.TESTS_DATA_DIR, 'string_classifier_test.yaml') with python_utils.open_file(yaml_path, 'r') as yaml_file: self.yaml_content = yaml_file.read() self.signup(self.CURRICULUM_ADMIN_EMAIL, self.CURRICULUM_ADMIN_USERNAME) self.signup('*****@*****.**', 'mod') assets_list = [] with self.swap(feconf, 'ENABLE_ML_CLASSIFIERS', True): exp_services.save_new_exploration_from_yaml_and_assets( feconf.SYSTEM_COMMITTER_ID, self.yaml_content, self.exp_id, assets_list) self.exploration = exp_fetchers.get_exploration_by_id(self.exp_id) self.algorithm_id = feconf.INTERACTION_CLASSIFIER_MAPPING[ self.exploration.states['Home'].interaction.id]['algorithm_id'] self.algorithm_version = feconf.INTERACTION_CLASSIFIER_MAPPING[ self.exploration.states['Home'].interaction. id]['algorithm_version'] self.classifier_data = { '_alpha': 0.1, '_beta': 0.001, '_prediction_threshold': 0.5, '_training_iterations': 25, '_prediction_iterations': 5, '_num_labels': 10, '_num_docs': 12, '_num_words': 20, '_label_to_id': { 'text': 1 }, '_word_to_id': { 'hello': 2 }, '_w_dp': [], '_b_dl': [], '_l_dp': [], '_c_dl': [], '_c_lw': [], '_c_l': [], } classifier_training_job = ( classifier_services.get_classifier_training_job( self.exp_id, self.exploration.version, 'Home', self.algorithm_id)) self.assertIsNotNone(classifier_training_job) self.job_id = classifier_training_job.job_id # TODO(pranavsid98): Replace the three commands below with # mark_training_job_pending after Giritheja's PR gets merged. classifier_training_job_model = ( classifier_models.ClassifierTrainingJobModel.get(self.job_id, strict=False)) classifier_training_job_model.status = ( feconf.TRAINING_JOB_STATUS_PENDING) classifier_training_job_model.update_timestamps() classifier_training_job_model.put() self.job_result = (training_job_response_payload_pb2. TrainingJobResponsePayload.JobResult()) self.job_result.job_id = self.job_id classifier_frozen_model = ( text_classifier_pb2.TextClassifierFrozenModel()) classifier_frozen_model.model_json = json.dumps(self.classifier_data) self.job_result.text_classifier.CopyFrom(classifier_frozen_model) self.payload_proto = ( training_job_response_payload_pb2.TrainingJobResponsePayload()) self.payload_proto.job_result.CopyFrom(self.job_result) self.payload_proto.vm_id = feconf.DEFAULT_VM_ID self.secret = feconf.DEFAULT_VM_SHARED_SECRET self.payload_proto.signature = classifier_services.generate_signature( python_utils.convert_to_bytes(self.secret), python_utils.convert_to_bytes( self.payload_proto.job_result.SerializeToString()), self.payload_proto.vm_id) self.payload_for_fetching_next_job_request = { 'vm_id': feconf.DEFAULT_VM_ID, 'message': json.dumps({}) } self.payload_for_fetching_next_job_request['signature'] = ( classifier_services.generate_signature( python_utils.convert_to_bytes(self.secret), python_utils.convert_to_bytes( self.payload_for_fetching_next_job_request['message']), self.payload_for_fetching_next_job_request['vm_id']))