use of de.tum.in.www1.artemis.service.compass.controller.ModelClusterFactory in project ArTEMiS by ls1intum.
the class AssessmentKnowledgeIntegrationTest method testSetModelAssessmentKnowledgeToModelElements.
/**
* Tests that a ModelAssessmentKnowledge is correctly set to model elements
* based on the ModelAssessmentKnowledge of the respective exercise
*
* @throws Exception might be thrown from Network Call to Artemis API
*/
@Test
@WithMockUser(username = "instructor1", roles = "INSTRUCTOR")
public void testSetModelAssessmentKnowledgeToModelElements() throws Exception {
ModelingSubmission submission1 = ModelFactory.generateModelingSubmission(FileUtils.loadFileFromResources("test-data/model-submission/model.54727.json"), true);
submission1.setId(1L);
ModelingSubmission submission2 = ModelFactory.generateModelingSubmission(FileUtils.loadFileFromResources("test-data/model-submission/model.54727.cpy.json"), true);
submission2.setId(2L);
ModelingSubmission submission3 = ModelFactory.generateModelingSubmission(FileUtils.loadFileFromResources("test-data/model-submission/model.54727.cpy.json"), true);
submission3.setId(3L);
ModelingSubmission submission4 = ModelFactory.generateModelingSubmission(FileUtils.loadFileFromResources("test-data/model-submission/model.54727.cpy.json"), true);
submission4.setId(4L);
Course course = database.addEmptyCourse();
ModelingExercise exercise1 = modelingExerciseUtilService.createModelingExercise(course.getId());
ModelingExercise exercise2 = modelingExerciseUtilService.createModelingExercise(course.getId());
modelAssessmentKnowledgeService = new ModelAssessmentKnowledgeService(modelAssessmentKnowledgeRepository, modelingExerciseRepository);
exercise1.setKnowledge(modelAssessmentKnowledgeService.createNewKnowledge());
exercise2.setKnowledge(modelAssessmentKnowledgeService.createNewKnowledge());
ModelClusterFactory modelClusterFactory = new ModelClusterFactory();
List<ModelCluster> modelClusters1 = modelClusterFactory.buildClusters(List.of(submission1, submission2), exercise1);
List<ModelCluster> modelClusters2 = modelClusterFactory.buildClusters(List.of(submission3, submission4), exercise2);
ModelCluster modelCluster = modelClusters1.get(0);
for (ModelElement element : modelCluster.getModelElements()) {
assertThat(element.getKnowledge().getId()).isEqualTo(exercise1.getKnowledge().getId());
}
modelCluster = modelClusters2.get(0);
for (ModelElement element : modelCluster.getModelElements()) {
assertThat(element.getKnowledge().getId()).isEqualTo(exercise2.getKnowledge().getId());
}
assertThat(exercise1.getKnowledge().getId()).isNotEqualTo(exercise2.getKnowledge().getId());
}
use of de.tum.in.www1.artemis.service.compass.controller.ModelClusterFactory in project ArTEMiS by ls1intum.
the class CompassService method getSuggestionResult.
/**
* Selects the feedback suggestion for each element in submission and creates a result from them
* Returns null if no feedback can be selected or the submission has already a manual feedback
*
* @param modelingSubmission the submission to select feedbacks for
* @param modelingExercise the modeling exercise to which the submission belongs
* @return the semi-automatic result that has the feedbacks inside
*/
public Result getSuggestionResult(ModelingSubmission modelingSubmission, ModelingExercise modelingExercise) {
Result result = getAutomaticResultForSubmission(modelingSubmission);
if (result != null) {
List<Feedback> feedbacksForSuggestion = new ArrayList<>();
ModelClusterFactory clusterBuilder = new ModelClusterFactory();
List<UMLElement> elements = clusterBuilder.getModelElements(modelingSubmission);
List<ModelElement> modelElements = modelElementRepository.findByModelElementIdIn(elements.stream().map(UMLElement::getJSONElementID).collect(Collectors.toList()));
List<Long> clusterIds = modelElements.stream().map(ModelElement::getCluster).map(ModelCluster::getId).collect(Collectors.toList());
List<ModelCluster> modelClusters = modelClusterRepository.findAllByIdInWithEagerElements(clusterIds);
List<String> references = modelClusters.stream().flatMap(modelCluster -> modelCluster.getModelElements().stream()).map(modelElement1 -> modelElement1.getModelElementType() + ":" + modelElement1.getModelElementId()).collect(Collectors.toList());
List<Feedback> feedbacks = feedbackRepository.findByReferenceInAndResult_Submission_Participation_Exercise(references, modelingExercise);
for (ModelElement modelElement : modelElements) {
if (modelElement != null) {
ModelCluster cluster = modelClusters.get(modelClusters.indexOf(modelElement.getCluster()));
Set<ModelElement> similarElements = cluster.getModelElements();
List<String> similarReferences = similarElements.stream().map(element -> element.getModelElementType() + ":" + element.getModelElementId()).toList();
List<Feedback> similarFeedbacks = feedbacks.stream().filter(feedback -> similarReferences.contains(feedback.getReference())).collect(Collectors.toList());
Feedback suggestedFeedback = FeedbackSelector.selectFeedback(modelElement, similarFeedbacks, result);
if (suggestedFeedback != null) {
feedbacksForSuggestion.add(suggestedFeedback);
}
}
}
if (feedbacksForSuggestion.isEmpty()) {
return null;
}
// Note, that a result is always initialized with an empty list -> no NPE here
result.getFeedbacks().clear();
result.getFeedbacks().addAll(feedbacksForSuggestion);
result.setHasFeedback(false);
result.setAssessmentType(AssessmentType.SEMI_AUTOMATIC);
}
return result;
}
use of de.tum.in.www1.artemis.service.compass.controller.ModelClusterFactory in project ArTEMiS by ls1intum.
the class CompassService method build.
/**
* Builds and saves the clusters
* Does not build clusters if there is already a cluster for given exercise
*
* @param modelingExercise the exercise to build clusters for
*/
public void build(ModelingExercise modelingExercise) {
long start = System.nanoTime();
if (!isSupported(modelingExercise)) {
return;
}
List<ModelCluster> currentClusters = modelClusterRepository.findAllByExerciseIdWithEagerElements(modelingExercise.getId());
if (!currentClusters.isEmpty()) {
log.info("Clusters have already been built. First delete existing clusters and then rebuild them!");
// Do not build submissions if this process has already been done before
return;
}
List<ModelingSubmission> submissions = modelingSubmissionRepository.findSubmittedByExerciseIdWithEagerResultsAndFeedback(modelingExercise.getId());
log.info("ModelCluster: start building clusters of {} submissions for modeling exercise {}", submissions.size(), modelingExercise.getId());
ModelClusterFactory clusterFactory = new ModelClusterFactory();
List<ModelCluster> modelClusters = clusterFactory.buildClusters(submissions, modelingExercise);
log.info("ModelClusterTimeLog: building clusters of {} submissions for modeling exercise {} done in {}", submissions.size(), modelingExercise.getId(), TimeLogUtil.formatDurationFrom(start));
modelClusterRepository.saveAll(modelClusters);
modelElementRepository.saveAll(modelClusters.stream().flatMap(modelCluster -> modelCluster.getModelElements().stream()).collect(Collectors.toList()));
log.info("ModelClusterTimeLog: building and saving clusters of {} submissions for exercise {} done in {}", submissions.size(), modelingExercise.getId(), TimeLogUtil.formatDurationFrom(start));
}
use of de.tum.in.www1.artemis.service.compass.controller.ModelClusterFactory in project Artemis by ls1intum.
the class CompassService method build.
/**
* Builds and saves the clusters
* Does not build clusters if there is already a cluster for given exercise
*
* @param modelingExercise the exercise to build clusters for
*/
public void build(ModelingExercise modelingExercise) {
long start = System.nanoTime();
if (!isSupported(modelingExercise)) {
return;
}
List<ModelCluster> currentClusters = modelClusterRepository.findAllByExerciseIdWithEagerElements(modelingExercise.getId());
if (!currentClusters.isEmpty()) {
log.info("Clusters have already been built. First delete existing clusters and then rebuild them!");
// Do not build submissions if this process has already been done before
return;
}
List<ModelingSubmission> submissions = modelingSubmissionRepository.findSubmittedByExerciseIdWithEagerResultsAndFeedback(modelingExercise.getId());
log.info("ModelCluster: start building clusters of {} submissions for modeling exercise {}", submissions.size(), modelingExercise.getId());
ModelClusterFactory clusterFactory = new ModelClusterFactory();
List<ModelCluster> modelClusters = clusterFactory.buildClusters(submissions, modelingExercise);
log.info("ModelClusterTimeLog: building clusters of {} submissions for modeling exercise {} done in {}", submissions.size(), modelingExercise.getId(), TimeLogUtil.formatDurationFrom(start));
modelClusterRepository.saveAll(modelClusters);
modelElementRepository.saveAll(modelClusters.stream().flatMap(modelCluster -> modelCluster.getModelElements().stream()).collect(Collectors.toList()));
log.info("ModelClusterTimeLog: building and saving clusters of {} submissions for exercise {} done in {}", submissions.size(), modelingExercise.getId(), TimeLogUtil.formatDurationFrom(start));
}
use of de.tum.in.www1.artemis.service.compass.controller.ModelClusterFactory in project Artemis by ls1intum.
the class CompassService method getSuggestionResult.
/**
* Selects the feedback suggestion for each element in submission and creates a result from them
* Returns null if no feedback can be selected or the submission has already a manual feedback
*
* @param modelingSubmission the submission to select feedbacks for
* @param modelingExercise the modeling exercise to which the submission belongs
* @return the semi-automatic result that has the feedbacks inside
*/
public Result getSuggestionResult(ModelingSubmission modelingSubmission, ModelingExercise modelingExercise) {
Result result = getAutomaticResultForSubmission(modelingSubmission);
if (result != null) {
List<Feedback> feedbacksForSuggestion = new ArrayList<>();
ModelClusterFactory clusterBuilder = new ModelClusterFactory();
List<UMLElement> elements = clusterBuilder.getModelElements(modelingSubmission);
List<ModelElement> modelElements = modelElementRepository.findByModelElementIdIn(elements.stream().map(UMLElement::getJSONElementID).collect(Collectors.toList()));
List<Long> clusterIds = modelElements.stream().map(ModelElement::getCluster).map(ModelCluster::getId).collect(Collectors.toList());
List<ModelCluster> modelClusters = modelClusterRepository.findAllByIdInWithEagerElements(clusterIds);
List<String> references = modelClusters.stream().flatMap(modelCluster -> modelCluster.getModelElements().stream()).map(modelElement1 -> modelElement1.getModelElementType() + ":" + modelElement1.getModelElementId()).collect(Collectors.toList());
List<Feedback> feedbacks = feedbackRepository.findByReferenceInAndResult_Submission_Participation_Exercise(references, modelingExercise);
for (ModelElement modelElement : modelElements) {
if (modelElement != null) {
ModelCluster cluster = modelClusters.get(modelClusters.indexOf(modelElement.getCluster()));
Set<ModelElement> similarElements = cluster.getModelElements();
List<String> similarReferences = similarElements.stream().map(element -> element.getModelElementType() + ":" + element.getModelElementId()).toList();
List<Feedback> similarFeedbacks = feedbacks.stream().filter(feedback -> similarReferences.contains(feedback.getReference())).collect(Collectors.toList());
Feedback suggestedFeedback = FeedbackSelector.selectFeedback(modelElement, similarFeedbacks, result);
if (suggestedFeedback != null) {
feedbacksForSuggestion.add(suggestedFeedback);
}
}
}
if (feedbacksForSuggestion.isEmpty()) {
return null;
}
// Note, that a result is always initialized with an empty list -> no NPE here
result.getFeedbacks().clear();
result.getFeedbacks().addAll(feedbacksForSuggestion);
result.setHasFeedback(false);
result.setAssessmentType(AssessmentType.SEMI_AUTOMATIC);
}
return result;
}
Aggregations