From 3dc57e747c6aa482ba710a9cc99f373d22ccaa1d Mon Sep 17 00:00:00 2001 From: Alexander Diewald <diewald@fortiss.org> Date: Mon, 10 Jul 2017 13:14:40 +0000 Subject: [PATCH] - Merge latest changes from DREAMS branch (trunk). --- .../af3/exploration/alg/dse/Explorer.java | 2 +- .../dse/ImplicitExplorationTargetFactory.java | 13 ++- .../alg/dse/backend/ExplorerBackendBase.java | 81 ++++++++----------- .../backend/opt4j/Opt4JExplorerBackend.java | 65 +++++++++++++-- .../opt4j/problem/EvaluatorWrapper.java | 3 +- ...entMultiAllocationConstraintEvaluator.java | 25 ++++-- ...ntMultiDislocationConstraintEvaluator.java | 7 +- .../constraint/ConstraintEvaluatorBase.java | 11 ++- .../DeadlineConstraintEvaluator.java | 9 ++- .../constraint/IConstraintEvaluator.java | 7 +- .../MappingEvaluatorConstraint.java | 7 +- .../constraint/PeriodConstraintEvaluator.java | 15 ++-- ...fetyIntegrityLevelConstraintEvaluator.java | 7 +- ...gnSpaceExplorationModelElementFactory.java | 7 ++ 14 files changed, 165 insertions(+), 94 deletions(-) diff --git a/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/Explorer.java b/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/Explorer.java index f10e6028..295541c6 100644 --- a/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/Explorer.java +++ b/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/Explorer.java @@ -116,7 +116,7 @@ public class Explorer { // Invoke the backend in order to perform the DSE IExplorerBackend<? extends IOptimizer> explorerBackend = - createExplorerBackend(dse, expSpecCopy, targetAssocMap, systemModelAdapter, + createExplorerBackend(dse, expSpec, targetAssocMap, systemModelAdapter, requestedSolutions, progressMonitor); CompositeExplorationSolution<?> explorationResult = explorerBackend.explore(); diff --git a/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/ImplicitExplorationTargetFactory.java b/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/ImplicitExplorationTargetFactory.java index 8f890543..673c5bd6 100644 --- a/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/ImplicitExplorationTargetFactory.java +++ b/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/ImplicitExplorationTargetFactory.java @@ -76,7 +76,18 @@ public class ImplicitExplorationTargetFactory { public Collection<ExplorationConstraint<?>> createImplicitExplorationTargets( ExplorationSpecification expSpec, SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter) throws Exception { - return createPeriodConstraints(systemModelAdapter); + Collection<ExplorationConstraint<?>> constraints = new ArrayList<>(); + constraints.addAll(createPeriodConstraints(systemModelAdapter)); + + // Reassign the ids of generated constraints. By default, they are set to 0. Each constraint + // needs a "unique" id for its constraint type. + int constrId = 0; + for(ExplorationConstraint<?> curConstraint : constraints) { + curConstraint.setId(constrId); + constrId++; + } + + return constraints; } /** diff --git a/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/backend/ExplorerBackendBase.java b/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/backend/ExplorerBackendBase.java index 59b13be3..e4b433df 100644 --- a/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/backend/ExplorerBackendBase.java +++ b/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/backend/ExplorerBackendBase.java @@ -19,15 +19,12 @@ package org.fortiss.af3.exploration.alg.dse.backend; import java.util.Collection; import java.util.Map; -import java.util.Map.Entry; import java.util.Set; import javax.activation.UnsupportedDataTypeException; import org.eclipse.core.runtime.IProgressMonitor; -import org.fortiss.af3.exploration.alg.dse.CompositeExplorationSolution; import org.fortiss.af3.exploration.alg.dse.DSEFactory; -import org.fortiss.af3.exploration.alg.dse.SolutionQuantification; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.ComposablePhenotype; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.Phenotype; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.EvaluatorWrapper; @@ -42,6 +39,7 @@ import org.fortiss.af3.exploration.model.ExplorationSpecification; import org.fortiss.af3.exploration.model.ExplorationTarget; import org.fortiss.af3.exploration.moea.model.DseSpecification; import org.fortiss.af3.exploration.moea.model.parameters.IOptimizer; +import org.opt4j.core.Value; import org.opt4j.core.problem.Evaluator; /** @@ -58,6 +56,7 @@ public abstract class ExplorerBackendBase<O extends IOptimizer> implements IExpl // TODO: remove the DSE Spec. It is currently here protected DseSpecification dse; + /** Contains all ExplorationTargets of the exploration. */ protected ExplorationSpecification expSpec; /** @@ -149,54 +148,40 @@ public abstract class ExplorerBackendBase<O extends IOptimizer> implements IExpl * fulfilled by applying the validate function of the {@link IConstraintEvaluator}s onto each * possible solution. */ - protected CompositeExplorationSolution<?> validate( - CompositeExplorationSolution<?> explorationResult, - Collection<EvaluatorWrapper<?, ?, ?>> evalWrappers) { - CompositeExplorationSolution<?> feasibleExplorationResult = explorationResult.copy(); - - // Iterate over all (feasible + infeasible) solutions - for(Entry<IExplorationSolution<?>, SolutionQuantification> solution : explorationResult - .getSolutionQuantification().entrySet()) { - boolean isFeasible = - validateSolution(solution.getKey(), solution.getValue(), evalWrappers); - - // Remove the current solution if the feasibility check failed. - if(!isFeasible) { - feasibleExplorationResult.deleteSolutionQuantification(solution.getKey()); - } - } - - return feasibleExplorationResult; - } + // protected CompositeExplorationSolution<?> validate( + // CompositeExplorationSolution<?> explorationResult, + // Collection<EvaluatorWrapper<?, ?, ?>> evalWrappers) { + // CompositeExplorationSolution<?> feasibleExplorationResult = explorationResult.copy(); + // + // // Iterate over all (feasible + infeasible) solutions + // for(Entry<IExplorationSolution<?>, SolutionQuantification> solution : explorationResult + // .getSolutionQuantification().entrySet()) { + // boolean isFeasible = + // validateSolution(solution.getKey(), solution.getValue(), evalWrappers); + // + // // Remove the current solution if the feasibility check failed. + // if(!isFeasible) { + // feasibleExplorationResult.deleteSolutionQuantification(solution.getKey()); + // } + // } + // + // return feasibleExplorationResult; + // } /** */ - private <M extends Phenotype> boolean validateSolution(IExplorationSolution<?> solution, - SolutionQuantification value, Collection<EvaluatorWrapper<?, ?, ?>> evalWrappers) { - boolean isFeasible = true; - - for(ExplorationTarget<?> expTarget : targetAssocMap.values()) { - if(expTarget instanceof ExplorationConstraint<?>) { - EvaluatorWrapper<?, ?, ?> evalWrapper = getEvaluatorOf(expTarget, evalWrappers); - - assert (evalWrapper.getEvaluator() instanceof IConstraintEvaluator) : "The evaluator for the exploration constraint " + - expTarget.getName() + - " has an evaluator which is not an IConstraintEvaluator."; - - @SuppressWarnings("unchecked") Class<M> phenoClass = - (Class<M>)evalWrapper.getTargetPhenotypeType(); - M targetSubSolution = solution.getSubSolution(phenoClass); - isFeasible = - ((IConstraintEvaluator<?, ?, ?>)evalWrapper.getEvaluator()).validate( - expTarget, targetSubSolution, phenoClass, value); - - if(!isFeasible) { - // Exit if the validation fails for a single constraint. - break; - } - } - } + protected <M extends Phenotype> boolean validateSolution(IExplorationSolution<?> solution, + ExplorationConstraint target, Value<?> value, + Collection<EvaluatorWrapper<?, ?, ?>> evalWrappers) { + EvaluatorWrapper<?, ?, ?> evalWrapper = getEvaluatorOf(target, evalWrappers); + + assert (evalWrapper.getEvaluator() instanceof IConstraintEvaluator) : "The evaluator for the exploration constraint " + + target.getName() + " has an evaluator which is not an IConstraintEvaluator."; - return isFeasible; + @SuppressWarnings("unchecked") Class<M> phenoClass = + (Class<M>)evalWrapper.getTargetPhenotypeType(); + M targetSubSolution = solution.getSubSolution(phenoClass); + return ((IConstraintEvaluator<?, ?, ?>)evalWrapper.getEvaluator()).validate(target, + targetSubSolution, phenoClass, value); } /** diff --git a/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/Opt4JExplorerBackend.java b/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/Opt4JExplorerBackend.java index 84d6ec94..c4343025 100644 --- a/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/Opt4JExplorerBackend.java +++ b/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/Opt4JExplorerBackend.java @@ -18,10 +18,13 @@ $Id: Opt4JExplorerBackend.java 3730 2016-10-19 15:43:43Z diewald $ package org.fortiss.af3.exploration.alg.dse.backend.opt4j; import static org.fortiss.tooling.kernel.utils.EcoreUtils.pickFirstInstanceOf; +import static org.fortiss.tooling.kernel.utils.EcoreUtils.pickInstanceOf; import java.util.ArrayList; import java.util.Collection; +import java.util.HashSet; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import org.eclipse.core.runtime.IProgressMonitor; @@ -38,13 +41,20 @@ import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.mutate.taskins import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.mutate.taskmapping.MutateTaskMappingModule; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.ArchitectureExplorationProblemModule; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.solution.ArchitectureSolution; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.solution.IExplorationSolution; import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter; import org.fortiss.af3.exploration.alg.service.IExplorationEncoding; +import org.fortiss.af3.exploration.model.ExplorationConstraint; import org.fortiss.af3.exploration.model.ExplorationSpecification; import org.fortiss.af3.exploration.model.ExplorationTarget; import org.fortiss.af3.exploration.moea.model.DseSpecification; import org.fortiss.af3.exploration.moea.model.feature.SafetyExploration; import org.fortiss.af3.exploration.moea.model.parameters.EAOptimizer; +import org.opt4j.core.Individual; +import org.opt4j.core.Objective; +import org.opt4j.core.Objectives; +import org.opt4j.core.Value; +import org.opt4j.core.common.archive.DefaultArchive; import org.opt4j.core.common.completer.IndividualCompleterModule; import org.opt4j.core.config.Task; import org.opt4j.core.config.TaskStateListener; @@ -251,9 +261,57 @@ public class Opt4JExplorerBackend extends ExplorerBackendBase<EAOptimizer> { // Execute optimization opt4JTask.execute(); + // Collect the set objectives + Collection<Objective> objectiveSet = new HashSet<>(); + for(ExplorationTarget<?> copiedExpTarget : targetAssocMap.values()) { + if(!(copiedExpTarget instanceof ExplorationConstraint<?>)) { + Objective constraintObjective = + archExplorationProblemModule.getObjectiveOf(copiedExpTarget); + objectiveSet.add(constraintObjective); + } + } + + Archive archive = new DefaultArchive(); + Archive completeArchive = opt4JTask.getInstance(Archive.class); + + // Check each individual for constraint violations and only further process those which + // violate none. + Collection<Individual> feasibleIndividuals = new ArrayList<>(); + for(Individual curIndividual : completeArchive) { + boolean satisfiesAllConstraints = true; + for(ExplorationConstraint<?> target : pickInstanceOf(ExplorationConstraint.class, + expSpec.getTargets())) { + Objective objective = archExplorationProblemModule.getObjectiveOf(target); + Value<?> value = curIndividual.getObjectives().get(objective); + if(!validateSolution((IExplorationSolution<?>)curIndividual.getPhenotype(), + target, value, archExplorationProblemModule.getEvaluators())) { + satisfiesAllConstraints = false; + } + } + + if(satisfiesAllConstraints) { + feasibleIndividuals.add(curIndividual); + } + } + + // For the final Pareto-Front calculation, consider only Objectives. + // Create a new archive with the same individuals that have only objective evaluations. + // TODO: For robust optimization, we should also consider a distance metric to the + // constraint's bounds. + for(Individual curIndividual : feasibleIndividuals) { + Objectives oldObjectives = curIndividual.getObjectives(); + Objectives reducedObjectives = new Objectives(); + for(Entry<Objective, Value<?>> singleObjective : oldObjectives) { + if(objectiveSet.contains(singleObjective.getKey())) { + reducedObjectives.add(singleObjective.getKey(), singleObjective.getValue()); + } + } + curIndividual.setObjectives(reducedObjectives); + archive.update(curIndividual); + } + rval = - new Opt4JExplorationSolutionSet<ArchitectureSolution>( - opt4JTask.getInstance(Archive.class), targetAssocMap, + new Opt4JExplorationSolutionSet<ArchitectureSolution>(archive, targetAssocMap, archExplorationProblemModule); rval.setCompletedIterations(opt4JTask.getIteration()); @@ -261,9 +319,6 @@ public class Opt4JExplorerBackend extends ExplorerBackendBase<EAOptimizer> { } catch(Exception e) { ex = e; } finally { - if(rval != null) { - rval = validate(rval, archExplorationProblemModule.getEvaluators()); - } opt4JTask.close(); } diff --git a/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/EvaluatorWrapper.java b/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/EvaluatorWrapper.java index b7b77d81..89698155 100644 --- a/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/EvaluatorWrapper.java +++ b/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/EvaluatorWrapper.java @@ -98,7 +98,8 @@ public class EvaluatorWrapper<P, RT, T extends ExplorationTarget<RT>> implements String objectiveName = goal.getName() == null ? goal.getClass().toString() + - Integer.toString(goal.getId()) : goal.getName(); + Integer.toString(goal.getId()) : goal.getName() + + Integer.toString(goal.getId()); objective = new Objective(objectiveName, direction == OptimizationDirectionEnum.MIN ? Sign.MIN : Sign.MAX); diff --git a/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/ComponentMultiAllocationConstraintEvaluator.java b/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/ComponentMultiAllocationConstraintEvaluator.java index 3cb30da7..52b61e9a 100644 --- a/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/ComponentMultiAllocationConstraintEvaluator.java +++ b/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/ComponentMultiAllocationConstraintEvaluator.java @@ -24,7 +24,6 @@ import java.util.Collection; import java.util.Collections; import org.eclipse.emf.ecore.EObject; -import org.fortiss.af3.exploration.alg.dse.SolutionQuantification; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping.InstantiatedTaskMappingEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping.InstantiatedTaskMappingEntry; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.FlatPhenotypeMap; @@ -32,10 +31,12 @@ import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegen import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IDeployableComponentAdapter; import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IExecutionUnitAdapter; import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter; +import org.fortiss.af3.exploration.alg.dse.sysmodel.mapping.IMappingEntry; import org.fortiss.af3.exploration.alg.service.IExplorationTargetEvaluator; -import org.fortiss.af3.exploration.model.ExplorationTarget; +import org.fortiss.af3.exploration.model.ExplorationConstraint; import org.fortiss.af3.exploration.moea.model.predefined.ComponentMultiAllocationConstraint; import org.opt4j.core.DoubleValue; +import org.opt4j.core.Value; import com.google.common.collect.ClassToInstanceMap; @@ -100,10 +101,22 @@ public class ComponentMultiAllocationConstraintEvaluator<S extends InstantiatedT /** {@inheritDoc} */ @Override - public boolean validateInternal(ExplorationTarget<?> expTarget, T solution, - SolutionQuantification value) { - // Already considered in the operators. - // TODO: Just to be safe: add a real check. + public boolean validateInternal(ExplorationConstraint<?> expTarget, T solution, Value<?> value) { + Collection<IMappingEntry> entries = + solution.getIMappingEntriesOf(systemModelAdapter + .getDeployableComponentOf(((ComponentMultiAllocationConstraint)expTarget) + .getComponent())); + + if(entries.isEmpty()) { + return false; + } + + for(IMappingEntry entry : entries) { + if(!((ComponentMultiAllocationConstraint)expTarget).getExecutionUnits().contains( + entry.getTarget().getObject())) { + return false; + } + } return true; } diff --git a/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/ComponentMultiDislocationConstraintEvaluator.java b/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/ComponentMultiDislocationConstraintEvaluator.java index ff8b28fd..156dbc4b 100644 --- a/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/ComponentMultiDislocationConstraintEvaluator.java +++ b/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/ComponentMultiDislocationConstraintEvaluator.java @@ -24,7 +24,6 @@ import java.util.Collection; import java.util.Collections; import org.eclipse.emf.ecore.EObject; -import org.fortiss.af3.exploration.alg.dse.SolutionQuantification; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping.InstantiatedTaskMappingEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping.InstantiatedTaskMappingEntry; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.FlatPhenotypeMap; @@ -33,9 +32,10 @@ import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IDeployableComponentAda import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IExecutionUnitAdapter; import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter; import org.fortiss.af3.exploration.alg.service.IExplorationTargetEvaluator; -import org.fortiss.af3.exploration.model.ExplorationTarget; +import org.fortiss.af3.exploration.model.ExplorationConstraint; import org.fortiss.af3.exploration.moea.model.predefined.ComponentMultiDislocationConstraint; import org.opt4j.core.DoubleValue; +import org.opt4j.core.Value; import com.google.common.collect.ClassToInstanceMap; @@ -99,8 +99,7 @@ public class ComponentMultiDislocationConstraintEvaluator<S extends Instantiated /** {@inheritDoc} */ @Override - public boolean validateInternal(ExplorationTarget<?> expTarget, T solution, - SolutionQuantification value) { + public boolean validateInternal(ExplorationConstraint<?> expTarget, T solution, Value<?> value) { // Already considered in the operators. // TODO: Just to be safe: add a real check. return true; diff --git a/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/ConstraintEvaluatorBase.java b/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/ConstraintEvaluatorBase.java index 1ebd8517..c679a586 100644 --- a/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/ConstraintEvaluatorBase.java +++ b/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/ConstraintEvaluatorBase.java @@ -17,12 +17,11 @@ $Id: ConstraintEvaluatorBase.java 3730 2016-10-19 15:43:43Z diewald $ +--------------------------------------------------------------------------*/ package org.fortiss.af3.exploration.alg.dse.evaluator.constraint; -import org.fortiss.af3.exploration.alg.dse.SolutionQuantification; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.Phenotype; import org.fortiss.af3.exploration.alg.dse.evaluator.ExplorationTargetEvaluatorBase; import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter; import org.fortiss.af3.exploration.model.ExplorationConstraint; -import org.fortiss.af3.exploration.model.ExplorationTarget; +import org.opt4j.core.Value; import org.opt4j.core.problem.Evaluator; /** @@ -72,8 +71,8 @@ public abstract class ConstraintEvaluatorBase<P extends Phenotype, RT, T extends /** {@inheritDoc} */ @Override - public <M> boolean validate(ExplorationTarget<?> expTarget, M solution, Class<M> solutionType, - SolutionQuantification value) { + public <M> boolean validate(ExplorationConstraint<?> expTarget, M solution, + Class<M> solutionType, Value<?> value) { if(!solutionType.isAssignableFrom(solution.getClass())) { return false; } @@ -82,6 +81,6 @@ public abstract class ConstraintEvaluatorBase<P extends Phenotype, RT, T extends } /** Actual validation method that must be implemented by each {@link IConstraintEvaluator}. */ - public abstract boolean validateInternal(ExplorationTarget<?> expTarget, P solution, - SolutionQuantification value); + public abstract boolean validateInternal(ExplorationConstraint<?> expTarget, P solution, + Value<?> value); } diff --git a/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/DeadlineConstraintEvaluator.java b/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/DeadlineConstraintEvaluator.java index 467e089c..90b05d67 100644 --- a/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/DeadlineConstraintEvaluator.java +++ b/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/DeadlineConstraintEvaluator.java @@ -25,7 +25,6 @@ import java.util.Comparator; import java.util.HashSet; import org.eclipse.emf.ecore.EObject; -import org.fortiss.af3.exploration.alg.dse.SolutionQuantification; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskgraph.InstantiatedAcyclicTaskGraphEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping.InstantiatedTaskMappingEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping.InstantiatedTaskMappingEntry; @@ -37,9 +36,11 @@ import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter; import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.af3.AF3SystemModelAdapter; import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.taskgraph.TaskGraph; import org.fortiss.af3.exploration.alg.service.IExplorationTargetEvaluator; +import org.fortiss.af3.exploration.model.ExplorationConstraint; import org.fortiss.af3.exploration.model.ExplorationTarget; import org.fortiss.af3.exploration.model.time.DeadlineConstraint; import org.opt4j.core.DoubleValue; +import org.opt4j.core.Value; import com.google.common.collect.ClassToInstanceMap; @@ -179,10 +180,10 @@ public class DeadlineConstraintEvaluator<S extends InstantiatedTaskMappingEntry, /** {@inheritDoc} */ @Override - public boolean validateInternal(ExplorationTarget<?> expTarget, - StrictTTSchedule<S, T> solution, SolutionQuantification valueSet) { + public boolean validateInternal(ExplorationConstraint<?> expTarget, + StrictTTSchedule<S, T> solution, Value<?> value) { // TODO: Readd the getLimitation support or find another way to express the same. - Double evalValue = valueSet.getQuantificationOf(expTarget); + Double evalValue = value.getDouble(); assert (expTarget instanceof DeadlineConstraint); if(evalValue > ((DeadlineConstraint)expTarget).getLimitation() - NUMERIC_IMPRECISION) { return false; diff --git a/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/IConstraintEvaluator.java b/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/IConstraintEvaluator.java index 763f6161..282adc7b 100644 --- a/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/IConstraintEvaluator.java +++ b/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/IConstraintEvaluator.java @@ -17,9 +17,8 @@ $Id: IConstraintEvaluator.java 3404 2016-08-26 15:01:08Z diewald $ +--------------------------------------------------------------------------*/ package org.fortiss.af3.exploration.alg.dse.evaluator.constraint; -import org.fortiss.af3.exploration.alg.dse.SolutionQuantification; import org.fortiss.af3.exploration.model.ExplorationConstraint; -import org.fortiss.af3.exploration.model.ExplorationTarget; +import org.opt4j.core.Value; import org.opt4j.core.problem.Evaluator; /** @@ -38,6 +37,6 @@ public interface IConstraintEvaluator<P, RT, T extends ExplorationConstraint<RT> * The {@code validate} is applied to phenotypes in order to check whether proposed solutions * are contained within the feasible set. */ - <M> boolean validate(ExplorationTarget<?> expTarget, M solution, Class<M> solutionType, - SolutionQuantification value); + public <M> boolean validate(ExplorationConstraint<?> expTarget, M solution, + Class<M> solutionType, Value<?> value); } diff --git a/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/MappingEvaluatorConstraint.java b/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/MappingEvaluatorConstraint.java index 3e065004..c8ff2322 100644 --- a/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/MappingEvaluatorConstraint.java +++ b/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/MappingEvaluatorConstraint.java @@ -18,7 +18,6 @@ $Id: codetemplates.xml 1 2011-01-01 00:00:01Z hoelzl $ package org.fortiss.af3.exploration.alg.dse.evaluator.constraint; import org.eclipse.emf.ecore.EObject; -import org.fortiss.af3.exploration.alg.dse.SolutionQuantification; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.MappingEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.FlatPhenotypeMap; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.Phenotype; @@ -97,9 +96,9 @@ public class MappingEvaluatorConstraint extends MappingEvaluator implements /** {@inheritDoc} */ @Override - public <M> boolean validate(ExplorationTarget<?> expTarget, M solution, Class<M> solutionType, - SolutionQuantification value) { - Double evalValue = value.getQuantificationOf(expTarget); + public <M> boolean validate(ExplorationConstraint<?> expTarget, M solution, + Class<M> solutionType, Value<?> value) { + Double evalValue = value.getDouble(); if(evalValue > 0.0) { return false; } diff --git a/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/PeriodConstraintEvaluator.java b/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/PeriodConstraintEvaluator.java index 01137ea3..eb9277a4 100644 --- a/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/PeriodConstraintEvaluator.java +++ b/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/PeriodConstraintEvaluator.java @@ -23,7 +23,6 @@ import java.util.Collection; import java.util.HashSet; import org.eclipse.emf.ecore.EObject; -import org.fortiss.af3.exploration.alg.dse.SolutionQuantification; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskgraph.InstantiatedTaskGraphEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping.InstantiatedTaskMappingEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping.InstantiatedTaskMappingEntry; @@ -35,9 +34,11 @@ import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IExecutionUnitAdapter; import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter; import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.taskgraph.TaskGraph; import org.fortiss.af3.exploration.alg.service.IExplorationTargetEvaluator; +import org.fortiss.af3.exploration.model.ExplorationConstraint; import org.fortiss.af3.exploration.model.ExplorationTarget; import org.fortiss.af3.exploration.model.time.PeriodConstraint; import org.opt4j.core.DoubleValue; +import org.opt4j.core.Value; import com.google.common.collect.ClassToInstanceMap; @@ -94,7 +95,7 @@ public class PeriodConstraintEvaluator<S extends InstantiatedTaskMappingEntry, T } } - return new DoubleValue(retval > 0 ? pow(retval * getIterationCountAndIncrement(), 2) : 0); + return new DoubleValue(retval > 0 ? pow(retval, 2) : 0); } /** @@ -132,11 +133,13 @@ public class PeriodConstraintEvaluator<S extends InstantiatedTaskMappingEntry, T /** {@inheritDoc} */ @Override - public boolean validateInternal(ExplorationTarget<?> expTarget, - StrictTTSchedule<S, T> solution, SolutionQuantification valueSet) { - Double evalValue = valueSet.getQuantificationOf(expTarget); + public boolean validateInternal(ExplorationConstraint<?> expTarget, + StrictTTSchedule<S, T> solution, Value<?> value) { + Double evalValue = value.getDouble(); assert (expTarget instanceof PeriodConstraint); - if(evalValue > ((PeriodConstraint)expTarget).getLimitation() - NUMERIC_IMPRECISION) { + Double limit = ((PeriodConstraint)expTarget).getLimitation(); + limit = limit == null ? 0 : limit; + if(evalValue > limit + NUMERIC_IMPRECISION) { return false; } return true; diff --git a/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/SafetyIntegrityLevelConstraintEvaluator.java b/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/SafetyIntegrityLevelConstraintEvaluator.java index 3ed3d7a0..eab6f8d1 100644 --- a/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/SafetyIntegrityLevelConstraintEvaluator.java +++ b/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/SafetyIntegrityLevelConstraintEvaluator.java @@ -30,7 +30,6 @@ import java.util.stream.Collectors; import org.eclipse.emf.common.util.Enumerator; import org.eclipse.emf.ecore.EObject; import org.fortiss.af3.component.model.Component; -import org.fortiss.af3.exploration.alg.dse.SolutionQuantification; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping.InstantiatedTaskMappingEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping.InstantiatedTaskMappingEntry; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.FlatPhenotypeMap; @@ -39,10 +38,11 @@ import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IDeployableComponentAda import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IExecutionUnitAdapter; import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter; import org.fortiss.af3.exploration.alg.service.IExplorationTargetEvaluator; -import org.fortiss.af3.exploration.model.ExplorationTarget; +import org.fortiss.af3.exploration.model.ExplorationConstraint; import org.fortiss.af3.exploration.moea.model.predefined.SafetyIntegrityLevelConstraint; import org.fortiss.af3.safety.model.SIL; import org.opt4j.core.DoubleValue; +import org.opt4j.core.Value; import org.opt4j.core.problem.Evaluator; import com.google.common.collect.ClassToInstanceMap; @@ -80,8 +80,7 @@ public class SafetyIntegrityLevelConstraintEvaluator<S extends InstantiatedTaskM /** {@inheritDoc} */ @Override - public boolean validateInternal(ExplorationTarget<?> expTarget, T mapping, - SolutionQuantification valueSet) { + public boolean validateInternal(ExplorationConstraint<?> expTarget, T mapping, Value<?> value) { Map<IDeployableComponentAdapter<?>, Collection<S>> allocationMap = mapping.getAllocationMap(); List<IDeployableComponentAdapter<?>> silComponents = getSILComponentAdapters(); diff --git a/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/util/DesignSpaceExplorationModelElementFactory.java b/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/util/DesignSpaceExplorationModelElementFactory.java index c2979440..0c6626ce 100644 --- a/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/util/DesignSpaceExplorationModelElementFactory.java +++ b/org.fortiss.af3.exploration.alg/master/src/org/fortiss/af3/exploration/alg/util/DesignSpaceExplorationModelElementFactory.java @@ -19,6 +19,7 @@ package org.fortiss.af3.exploration.alg.util; import static org.fortiss.af3.exploration.util.ExplorationDslModelElementFactory.createObjectiveExpression; import static org.fortiss.af3.exploration.util.ExplorationDslModelElementFactory.createSummationOp; +import static org.fortiss.tooling.kernel.utils.UniqueIDUtils.prepareUniqueID; import org.eclipse.emf.common.util.EList; import org.fortiss.af3.component.model.Component; @@ -92,6 +93,7 @@ public class DesignSpaceExplorationModelElementFactory { DseSpecification dse = createDseSpecification("Default DSE model", ExecutionModel.TT_FAIL_SILENCE, createDefaultEAOptimizer(), modelContext); + prepareUniqueID(dse, explManager); modelContext.runAsCommand(() -> explManager.getDseSpecifications().add(dse)); return dse; } @@ -143,6 +145,7 @@ public class DesignSpaceExplorationModelElementFactory { EnergyMinObjective energyObjective = createEnergyMinObjective(); ITopLevelElement modelContext = IPersistencyService.getInstance().getTopLevelElementFor(targetSpec); + prepareUniqueID(energyObjective, targetSpec); modelContext.runAsCommand(() -> targetSpec.getTargets().add(energyObjective)); return energyObjective; } @@ -185,6 +188,7 @@ public class DesignSpaceExplorationModelElementFactory { FailureMinObjective failureMinObjective = createFailureMinObjective(); ITopLevelElement modelContext = IPersistencyService.getInstance().getTopLevelElementFor(targetSpec); + prepareUniqueID(failureMinObjective, targetSpec); modelContext.runAsCommand(() -> targetSpec.getTargets().add(failureMinObjective)); return failureMinObjective; } @@ -228,6 +232,7 @@ public class DesignSpaceExplorationModelElementFactory { ExplorationSpecification targetSpec) { ComponentMultiAllocationConstraint fixedDeploymentConstraint = createComponentMultiAllocationConstraint(); + prepareUniqueID(fixedDeploymentConstraint, targetSpec); ITopLevelElement modelContext = IPersistencyService.getInstance().getTopLevelElementFor(targetSpec); modelContext.runAsCommand(() -> targetSpec.getTargets().add(fixedDeploymentConstraint)); @@ -259,6 +264,7 @@ public class DesignSpaceExplorationModelElementFactory { ExplorationSpecification targetSpec) { ComponentMultiDislocationConstraint multiComponentDislocationConstraint = createComponentMultiDislocationConstraint(); + prepareUniqueID(multiComponentDislocationConstraint, targetSpec); ITopLevelElement modelContext = IPersistencyService.getInstance().getTopLevelElementFor(targetSpec); modelContext.runAsCommand(() -> targetSpec.getTargets().add( @@ -283,6 +289,7 @@ public class DesignSpaceExplorationModelElementFactory { SafetyIntegrityLevelConstraint safetyIntegrityLevelConstraint = PredefinedFactory.eINSTANCE.createSafetyIntegrityLevelConstraint(); safetyIntegrityLevelConstraint.setName("Safety Integrity Level Constraint"); + prepareUniqueID(safetyIntegrityLevelConstraint, targetSpec); ITopLevelElement modelContext = IPersistencyService.getInstance().getTopLevelElementFor(targetSpec); modelContext -- GitLab