From e11bce7ad3e803e80883499fec0ad6e4540ffe43 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Tue, 30 Jun 2020 18:03:48 +0200 Subject: Add modified VIATRA-DSE version --- .../dse/objectives/LeveledObjectivesHelper.java | 114 +++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 Solvers/VIATRA-Solver/org.eclipse.viatra.dse/src/org/eclipse/viatra/dse/objectives/LeveledObjectivesHelper.java (limited to 'Solvers/VIATRA-Solver/org.eclipse.viatra.dse/src/org/eclipse/viatra/dse/objectives/LeveledObjectivesHelper.java') diff --git a/Solvers/VIATRA-Solver/org.eclipse.viatra.dse/src/org/eclipse/viatra/dse/objectives/LeveledObjectivesHelper.java b/Solvers/VIATRA-Solver/org.eclipse.viatra.dse/src/org/eclipse/viatra/dse/objectives/LeveledObjectivesHelper.java new file mode 100644 index 00000000..2d81629b --- /dev/null +++ b/Solvers/VIATRA-Solver/org.eclipse.viatra.dse/src/org/eclipse/viatra/dse/objectives/LeveledObjectivesHelper.java @@ -0,0 +1,114 @@ +/******************************************************************************* + * Copyright (c) 2010-2016, Andras Szabolcs Nagy and Daniel Varro + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v. 2.0 which is available at + * http://www.eclipse.org/legal/epl-v20.html. + * + * SPDX-License-Identifier: EPL-2.0 + *******************************************************************************/ +package org.eclipse.viatra.dse.objectives; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; + +public class LeveledObjectivesHelper { + + private List objectives = new ArrayList(); + private IObjective[][] leveledObjectives; + + public LeveledObjectivesHelper(List objectives) { + this.objectives = objectives; + } + + public IObjective[][] initLeveledObjectives() { + if (objectives.isEmpty()) { + leveledObjectives = new IObjective[0][0]; + return leveledObjectives; + } + + int level = objectives.get(0).getLevel(); + boolean oneLevelOnly = true; + for (IObjective objective : objectives) { + if (objective.getLevel() != level) { + oneLevelOnly = false; + break; + } + } + + if (oneLevelOnly) { + leveledObjectives = new IObjective[1][objectives.size()]; + for (int i = 0; i < objectives.size(); i++) { + leveledObjectives[0][i] = objectives.get(i); + } + return leveledObjectives; + } + + IObjective[] objectivesArray = getSortedByLevelObjectives(objectives); + + int numberOfLevels = getNumberOfObjectiveLevels(objectivesArray); + + leveledObjectives = new IObjective[numberOfLevels][]; + + fillLeveledObjectives(objectivesArray); + + return leveledObjectives; + } + + private void fillLeveledObjectives(IObjective[] objectivesArray) { + int actLevel = objectivesArray[0].getLevel(); + int levelIndex = 0; + int lastIndex = 0; + int corrigationForLastLevel = 0; + boolean oneObjectiveAtLastLevel = false; + for (int i = 0; i < objectivesArray.length; i++) { + if (i == objectivesArray.length - 1) { + corrigationForLastLevel = 1; + if (objectivesArray[i - 1].getLevel() != objectivesArray[i].getLevel()) { + oneObjectiveAtLastLevel = true; + corrigationForLastLevel = 0; + } + } + if (objectivesArray[i].getLevel() != actLevel || corrigationForLastLevel == 1 || oneObjectiveAtLastLevel) { + leveledObjectives[levelIndex] = new IObjective[i - lastIndex + corrigationForLastLevel]; + for (int j = lastIndex; j < i + corrigationForLastLevel; j++) { + leveledObjectives[levelIndex][j - lastIndex] = objectivesArray[j]; + } + if (oneObjectiveAtLastLevel) { + leveledObjectives[levelIndex + 1] = new IObjective[1]; + leveledObjectives[levelIndex + 1][0] = objectivesArray[i]; + } + actLevel = objectivesArray[i].getLevel(); + levelIndex++; + lastIndex = i; + } + } + } + + private int getNumberOfObjectiveLevels(IObjective[] objectivesArray) { + + int actLevel = objectivesArray[0].getLevel(); + int numberOfLevels = 1; + + for (int i = 1; i < objectivesArray.length; i++) { + if (objectivesArray[i].getLevel() != actLevel) { + numberOfLevels++; + actLevel = objectivesArray[i].getLevel(); + } + } + + return numberOfLevels; + } + + private IObjective[] getSortedByLevelObjectives(List objectives) { + IObjective[] objectivesArray = objectives.toArray(new IObjective[objectives.size()]); + Arrays.sort(objectivesArray, Comparator.comparingInt(IObjective::getLevel)); + return objectivesArray; + } + + public IObjective[][] getLeveledObjectives() { + return leveledObjectives; + } + +} -- cgit v1.2.3-54-g00ecf