diff --git a/org.fortiss.af3.exploration.alg/trunk/model/moea.ecore b/org.fortiss.af3.exploration.alg/trunk/model/moea.ecore index 09a56b93615a69a1a3730dc99e887822fc34ffbc..deaa938beee729e071e2e604add78b6a0cdb0ef6 100644 --- a/org.fortiss.af3.exploration.alg/trunk/model/moea.ecore +++ b/org.fortiss.af3.exploration.alg/trunk/model/moea.ecore @@ -368,5 +368,10 @@ </eTypeArguments> </eGenericSuperTypes> </eClassifiers> + <eClassifiers xsi:type="ecore:EClass" name="NoEmptyPartitionConstraint"> + <eGenericSuperTypes eClassifier="ecore:EClass platform:/resource/org.fortiss.af3.exploration/model/exploration.ecore#//ExplorationConstraint"> + <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDoubleObject"/> + </eGenericSuperTypes> + </eClassifiers> </eSubpackages> </ecore:EPackage> diff --git a/org.fortiss.af3.exploration.alg/trunk/model/moea.genmodel b/org.fortiss.af3.exploration.alg/trunk/model/moea.genmodel index 713399b3761f1bf97252b09b7bf47fa925558b4d..e7b653e7fd63aaec8d2fbe82b88323277751dc3a 100644 --- a/org.fortiss.af3.exploration.alg/trunk/model/moea.genmodel +++ b/org.fortiss.af3.exploration.alg/trunk/model/moea.genmodel @@ -118,6 +118,7 @@ <genClasses ecoreClass="moea.ecore#//predefined/SafetyComparison"> <genTypeParameters ecoreTypeParameter="moea.ecore#//predefined/SafetyComparison/T"/> </genClasses> + <genClasses ecoreClass="moea.ecore#//predefined/NoEmptyPartitionConstraint"/> </nestedGenPackages> </genPackages> </genmodel:GenModel> diff --git a/org.fortiss.af3.exploration.alg/trunk/plugin.xml b/org.fortiss.af3.exploration.alg/trunk/plugin.xml index 1aa145dc7f7cc1505d3bb2b7f61ba4f11eb04008..37eedf75e878ff238a6674438b802e9201975f3f 100644 --- a/org.fortiss.af3.exploration.alg/trunk/plugin.xml +++ b/org.fortiss.af3.exploration.alg/trunk/plugin.xml @@ -264,6 +264,12 @@ modelElementClass="org.fortiss.af3.exploration.moea.model.predefined.EnergyMinObjective"> </modelElementClass> </evaluator> + <evaluator + module="org.fortiss.af3.exploration.alg.dse.evaluator.constraint.NoEmptyPartitionConstraintEvaluator"> + <modelElementClass + modelElementClass="org.fortiss.af3.exploration.model.ExplorationConstraint"> + </modelElementClass> + </evaluator> <evaluator module="org.fortiss.af3.exploration.alg.dse.evaluator.objective.MappingEvaluatorObjective"> <modelElementClass diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/.ratings b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/.ratings index 028a74cf75493ae601df0bcf890c01efdf1bf4cd..074416c7c05342e3157f8a312cb72dffc68d2a00 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/.ratings +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/.ratings @@ -1,6 +1,6 @@ CompositeExplorationSolution.java 7a32ca49d7ae4aa4ddc83a3c70ecdcfa5b1376a0 RED DSEFactory.java 0a2f2cc6a197e760c1f8223339ffa5f16856b184 RED -Explorer.java 4e23a668d0b0ad236e77eec2634efe2a0a6d0a23 RED -ImplicitExplorationTargetFactory.java 0b10dc4e8385bbdee0217dac783203080eb723f0 RED +Explorer.java 2194a74cbe51ca9e7dafb008dcefb51a54064dc8 RED +ImplicitExplorationTargetFactory.java e45c6c3344b46a275e2c74b5c714900229f5f8d3 RED SolutionQuantification.java efd31f192c3adbf1a4434452a19eb836a17390e2 RED TaskMappingFactory.java 5e41df9d45e338dbcfa95bc3818ca17774951893 RED diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/Explorer.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/Explorer.java index 123465dd6c3a02ed4715189a38b14e4f09e60d59..91cdb26b6f42e4e5e82a26f7dbd9141ec2ff7b18 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/Explorer.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/Explorer.java @@ -20,6 +20,7 @@ import static org.fortiss.tooling.common.util.LambdaUtils.filter; import static org.fortiss.tooling.common.util.LambdaUtils.filterType; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Set; @@ -68,8 +69,7 @@ public class Explorer { public CompositeExplorationSolution<?> explore(DseSpecification dse, SystemModelAdapter<?, ?, ?, ?, ?, ?, ?> systemModelAdapter, Set<Class<? extends IExplorationEncoding>> requestedSolutions, - IProgressMonitor progressMonitor, boolean generateImplicitConstraints) - throws Exception { + IProgressMonitor progressMonitor, boolean generateImplicitConstraints) throws Exception { validateDesignSpaceExploration(dse); validateSystemModelAdapter(systemModelAdapter); @@ -79,10 +79,11 @@ public class Explorer { DseSpecification dseSpec = copyDSESpecification(dse, targetAssocMap); ExplorationSpecification expSpec = dseSpec.getTargetSpecification(); // FIXME: temporally disable the the implicit constraint generation. - generateImplicitConstraints = false; + // generateImplicitConstraints = false; if(generateImplicitConstraints) { - expSpec.getTargets().addAll(ImplicitExplorationTargetFactory.getInstance() - .createImplicitExplorationTargets(dseSpec, systemModelAdapter)); + expSpec.getTargets().addAll( + ImplicitExplorationTargetFactory.getInstance() + .createImplicitExplorationTargets(dseSpec, systemModelAdapter)); } // Extract external models to add them to the available input models. @@ -104,13 +105,16 @@ public class Explorer { Collection<ExplorationConstraint<?>> genConstrs = filter(filterType(expSpec.getTargets(), ExplorationConstraint.class), t -> (t.getExpression() == null)); + // TODO: Reenable the constraint transformation service. + genConstrs = Collections.emptySet(); Collection<ExplorationConstraint<?>> transformedConstrs = constrService.getTransformedConstraints(systemModelAdapter, genConstrs); expSpec.getTargets().addAll(transformedConstrs); // Invoke the backend in order to perform the DSE - IExplorerBackend<? extends IOptimizer> explorerBackend = createExplorerBackend(dseSpec, - expSpec, targetAssocMap, systemModelAdapter, requestedSolutions, progressMonitor); + IExplorerBackend<? extends IOptimizer> explorerBackend = + createExplorerBackend(dseSpec, expSpec, targetAssocMap, systemModelAdapter, + requestedSolutions, progressMonitor); CompositeExplorationSolution<?> explorationResult = explorerBackend.explore(); // Print results @@ -152,33 +156,28 @@ public class Explorer { /** Validation of DSE configuration */ private void validateDesignSpaceExploration(DseSpecification dse) throws Exception { if(dse == null) { - createDesignSpaceExplorationConfigurationException( - "No DSE configuration has been specified."); + createDesignSpaceExplorationConfigurationException("No DSE configuration has been specified."); // Never here return; } if(dse.getParameters() == null) { - createDesignSpaceExplorationConfigurationException( - "No optimizer independent parameters have been provided."); + createDesignSpaceExplorationConfigurationException("No optimizer independent parameters have been provided."); } if(dse.getParameters().getExecutionModel() == null) { - createDesignSpaceExplorationConfigurationException( - "No execution model has been specified."); + createDesignSpaceExplorationConfigurationException("No execution model has been specified."); } if(dse.getOptimizer() == null) { - createDesignSpaceExplorationConfigurationException( - "No optimizer backend has been specified."); + createDesignSpaceExplorationConfigurationException("No optimizer backend has been specified."); } // TODO: create a validation whether the constraints or objectives are not given if(dse.getTargetSpecification() == null || dse.getTargetSpecification().getTargets() == null || dse.getTargetSpecification().getTargets().isEmpty()) { - createDesignSpaceExplorationConfigurationException( - "No Optimization goals have been provided."); + createDesignSpaceExplorationConfigurationException("No Optimization goals have been provided."); } } @@ -195,29 +194,24 @@ public class Explorer { SystemModelAdapter<?, ?, ?, ?, ?, ?, ?> systemModelAdapter) throws Exception { if(systemModelAdapter == null) { - createSystemModelAdapterConfigurationException( - "No DSE configuration has been specified."); + createSystemModelAdapterConfigurationException("No DSE configuration has been specified."); return; } if(systemModelAdapter.getDeployableComponents().isEmpty()) { - createSystemModelAdapterConfigurationException( - "Component architecture does not contain any deployable components.\n\nMake sure the \"Trigger\" annotation have been defined for all components that should be deployed."); + createSystemModelAdapterConfigurationException("Component architecture does not contain any deployable components.\n\nMake sure the \"Trigger\" annotation have been defined for all components that should be deployed."); } if(systemModelAdapter.getDeploymentTargets().isEmpty()) { - createSystemModelAdapterConfigurationException( - "Platform architecture does not contain any deployment targets.\n\nMake sure the \"Deployment Target\" annotation has been set for all execution units that should be deployed.\n\nMaybe you selected the wrong platform architecture?"); + createSystemModelAdapterConfigurationException("Platform architecture does not contain any deployment targets.\n\nMake sure the \"Deployment Target\" annotation has been set for all execution units that should be deployed.\n\nMaybe you selected the wrong platform architecture?"); } if(systemModelAdapter.getTaskGraphs().isEmpty()) { - createSystemModelAdapterConfigurationException( - "System model does not contain any valid task graphs. All tasks in a task graph must share the same period."); + createSystemModelAdapterConfigurationException("System model does not contain any valid task graphs. All tasks in a task graph must share the same period."); } if(systemModelAdapter.getAcyclicTaskGraphs().isEmpty()) { - createSystemModelAdapterConfigurationException( - "System model does not contain any valid task graphs. All tasks in a task graph must share the same period."); + createSystemModelAdapterConfigurationException("System model does not contain any valid task graphs. All tasks in a task graph must share the same period."); } // FIXME: readd? ==>> VL Generation. diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/ImplicitExplorationTargetFactory.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/ImplicitExplorationTargetFactory.java index 6e2162ac8b739af9627cd8d1872b20d2103b884f..5e0cedafb0e14a9f8b6ecd67a15678423c2bdee7 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/ImplicitExplorationTargetFactory.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/ImplicitExplorationTargetFactory.java @@ -27,6 +27,7 @@ import org.fortiss.af3.exploration.model.ExplorationConstraint; import org.fortiss.af3.exploration.model.ExplorationTarget; import org.fortiss.af3.exploration.model.time.PeriodConstraint; import org.fortiss.af3.exploration.moea.model.DseSpecification; +import org.fortiss.af3.exploration.moea.model.predefined.PredefinedFactory; import org.fortiss.af3.exploration.util.CommonExplorationTagetModelElementFactory; /** @@ -72,7 +73,8 @@ public class ImplicitExplorationTargetFactory { DseSpecification dse, SystemModelAdapter<?, ?, ?, ?, ?, ?, ?> systemModelAdapter) throws Exception { Collection<ExplorationConstraint<?>> constraints = new ArrayList<>(); - constraints.addAll(createPeriodConstraints(systemModelAdapter)); + // constraints.addAll(createPeriodConstraints(systemModelAdapter)); + constraints.add(createNoEmptyPartitionConstraint()); // Reassign the ids of generated constraints. By default, they are set to 0. Each constraint // needs a "unique" id for its constraint type. @@ -85,6 +87,14 @@ public class ImplicitExplorationTargetFactory { return constraints; } + /** + * Creates a single constraint that states a solution may not contain partitions without + * assigned tasks. + */ + private static ExplorationConstraint<?> createNoEmptyPartitionConstraint() { + return PredefinedFactory.eINSTANCE.createNoEmptyPartitionConstraint(); + } + /** * Creates a {@link PeriodConstraint} for each {@link TaskGraph} present in the * {@link SystemModelAdapter}. @@ -92,9 +102,9 @@ public class ImplicitExplorationTargetFactory { * @throws ConstraintGenerationException * if the generation of any {@link PeriodConstraint} fails. */ - private static Collection<ExplorationConstraint<?>> - createPeriodConstraints(SystemModelAdapter<?, ?, ?, ?, ?, ?, ?> systemModelAdapter) - throws ConstraintGenerationException { + private static Collection<ExplorationConstraint<?>> createPeriodConstraints( + SystemModelAdapter<?, ?, ?, ?, ?, ?, ?> systemModelAdapter) + throws ConstraintGenerationException { Collection<ExplorationConstraint<?>> constraints = new ArrayList<>(); for(TaskGraph tg : systemModelAdapter.getTaskGraphs()) { for(ITaskAdapter<?> component : tg.getTasks()) { @@ -104,8 +114,8 @@ public class ImplicitExplorationTargetFactory { component.getObject().getClass().getSimpleName() + ". Expected a Component."); } - constraints.add( - createPeriodConstraint((Component)component.getObject(), tg.getPeriod())); + constraints.add(createPeriodConstraint((Component)component.getObject(), + tg.getPeriod())); } } return constraints; diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/.ratings b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/.ratings index 737d149fb043607126cb5dd1e315b6f15a1d6d97..1a8861b9d4f2c4260cdece6385e90416335e56d1 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/.ratings +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/.ratings @@ -1,3 +1,3 @@ Opt4JExplorationSolutionSet.java fd1ca946198990604ea7a521e9d0335bef4ad8e1 RED -Opt4JExplorerBackend.java 800ec79e421755b139b34b08198aeccb4909d3a1 RED +Opt4JExplorerBackend.java 60aa6a82a54b7fff0819591939fb91db10116bf1 RED Opt4JSingleExplorationSolution.java 5b9e6ccdb887605faaa4d2a8b17b8fa1350fbafd RED diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/Opt4JExplorerBackend.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/Opt4JExplorerBackend.java index 82dc6fc55129549319c297e68548dce891e3d5e2..000231dcd7f3a76d06567c7bb987410fa80602ba 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/Opt4JExplorerBackend.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/Opt4JExplorerBackend.java @@ -106,8 +106,7 @@ public class Opt4JExplorerBackend extends ExplorerBackendBase<EAOptimizer> { Set<Class<? extends IExplorationEncoding>> requestedSolutions, IProgressMonitor progressMonitor) throws Exception { // Optimizer independent configuration - super(dse, expSpec, targetAssocMap, systemModelAdapter, requestedSolutions, - progressMonitor); + super(dse, expSpec, targetAssocMap, systemModelAdapter, requestedSolutions, progressMonitor); if(dse.getOptimizer() instanceof EAOptimizer) { init((EAOptimizer)dse.getOptimizer()); @@ -161,8 +160,9 @@ public class Opt4JExplorerBackend extends ExplorerBackendBase<EAOptimizer> { // }; // modules.add(multiEvaluatorModule); - archExplorationProblemModule = new ArchitectureExplorationProblemModule(dse, - systemModelAdapter, requestedSolutions); + archExplorationProblemModule = + new ArchitectureExplorationProblemModule(dse, systemModelAdapter, + requestedSolutions); modules.add(archExplorationProblemModule); // Configure operators @@ -193,16 +193,18 @@ public class Opt4JExplorerBackend extends ExplorerBackendBase<EAOptimizer> { .getDeploymentTargets())); // Task instantiation - MutateTaskInstanceModule mutateInstanceModule = new MutateTaskInstanceModule( - (Collection<ITaskAdapter<?>>)(Collection<?>)systemModelAdapter - .getDeployableComponents()); + MutateTaskInstanceModule mutateInstanceModule = + new MutateTaskInstanceModule( + (Collection<ITaskAdapter<?>>)(Collection<?>)systemModelAdapter + .getDeployableComponents()); // mutateInstanceModule.setMutationRateType(MutationRateType.ADAPTIVE); modules.add(mutateInstanceModule); // Task allocation - MutateTaskMappingModule mutateModule = new MutateTaskMappingModule( - (Collection<ITaskAdapter<?>>)(Collection<?>)systemModelAdapter - .getDeployableComponents()); + MutateTaskMappingModule mutateModule = + new MutateTaskMappingModule( + (Collection<ITaskAdapter<?>>)(Collection<?>)systemModelAdapter + .getDeployableComponents()); // mutateModule.setMutationRateType(MutationRateType.ADAPTIVE); // mutateModule.setMutationRate(0.125); modules.add(mutateModule); @@ -323,8 +325,9 @@ public class Opt4JExplorerBackend extends ExplorerBackendBase<EAOptimizer> { curIndividual.setObjectives(origObjectives); } - rval = new Opt4JExplorationSolutionSet<ArchitectureSolution>(archive, targetAssocMap, - archExplorationProblemModule); + rval = + new Opt4JExplorationSolutionSet<ArchitectureSolution>(archive, targetAssocMap, + archExplorationProblemModule); rval.setCompletedIterations(opt4JTask.getIteration()); } catch(Exception e) { diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/partitionmapping/.ratings b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/partitionmapping/.ratings index 36e5d7bc48fd4097c975b8422473c9f75501acd2..f053d6c1ec66de1ac03168b5cd8d9a8b01ba3ee6 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/partitionmapping/.ratings +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/partitionmapping/.ratings @@ -1,3 +1,3 @@ -Partition.java b870fdd306818d8195b662daee9546feebb28e18 RED +Partition.java 9cde7e1eed7eb12767b0f8f2c104afab6d64a9c1 RED PartitionMappingEncoding.java 45388dce4228074541b17410baabf30f9c22f858 RED PartitionMappingEntry.java 2f8f082e6bcd49dbe2f5ba88724850b54b20d637 RED diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/partitionmapping/Partition.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/partitionmapping/Partition.java index ef6399fc241c9ccdfec8f58b65869f4db6ce1642..89cfb87a73d3ae080a9dbe5594b48ad552f7a9f1 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/partitionmapping/Partition.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/partitionmapping/Partition.java @@ -52,4 +52,10 @@ public class Partition implements IExecutionUnitAdapter<Partition>, IRequestAdap // TODO No associated Object with a name at the moment. return null; } + + /** {@inheritDoc} */ + @Override + public String toString() { + return "Partition_" + hashCode(); + } } diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/ExpressionEvaluatorBase.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/ExpressionEvaluatorBase.java index 0bed25d2128390c1705929d594b7a5746a635200..0361b11e2019a9fa7c2535effde2de6afe02c56b 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/ExpressionEvaluatorBase.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/ExpressionEvaluatorBase.java @@ -62,12 +62,6 @@ public abstract class ExpressionEvaluatorBase<P extends Phenotype, RT, T extends */ protected ExpressionEvaluatorBase(SystemModelAdapter<?, ?, ?, ?, ?, ?, ?> systemModelAdapter, T explorationTarget) throws Exception { - if(explorationTarget.getExpression() == null) { - throw new Exception("The exploration target " + explorationTarget.getName() + " is" + - " not of the ExplorationTargetExpression. Thus, it cannot be evaluated by " + - getClass().getSimpleName() + "."); - } - this.systemModelAdapter = systemModelAdapter; this.explorationTarget = explorationTarget; this.expression = explorationTarget.getExpression(); diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/.ratings b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/.ratings index 8e5cb9b8e80bdc984c10c4cb9cc7e3c69eef3abc..eaa395c52e8efeaf9ca96d72100478cca5356a6d 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/.ratings +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/.ratings @@ -4,5 +4,6 @@ ConstraintEvaluatorBase.java 4a0e50681708c882bf314d689e1ddce322d0cd50 RED DeadlineConstraintEvaluator.java 6763810616860bd149f90a653776276681ee480e RED IConstraintEvaluator.java bca49bbdea5e089b0d045fc356ceedcb466df55e RED MappingEvaluatorConstraint.java f1f44bffbef03f1650a7f026428423838b16b845 RED +NoEmptyPartitionConstraintEvaluator.java 33f7b4215b2ada1e60474e9385150a9ea234b060 YELLOW PeriodConstraintEvaluator.java 05cf21be06c9ae12593f870efdf9c358efa2d97c RED SafetyIntegrityLevelConstraintEvaluator.java 9ad7129faaa35d89af4fced7a7121a0a142cb6f1 RED diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/NoEmptyPartitionConstraintEvaluator.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/NoEmptyPartitionConstraintEvaluator.java new file mode 100644 index 0000000000000000000000000000000000000000..8bd2aa32242dd116a784dc251d003a94000fc832 --- /dev/null +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/NoEmptyPartitionConstraintEvaluator.java @@ -0,0 +1,97 @@ +/*-------------------------------------------------------------------------+ +| Copyright 2018 fortiss GmbH | +| | +| Licensed under the Apache License, Version 2.0 (the "License"); | +| you may not use this file except in compliance with the License. | +| You may obtain a copy of the License at | +| | +| http://www.apache.org/licenses/LICENSE-2.0 | +| | +| Unless required by applicable law or agreed to in writing, software | +| distributed under the License is distributed on an "AS IS" BASIS, | +| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | +| See the License for the specific language governing permissions and | +| limitations under the License. | ++--------------------------------------------------------------------------*/ +package org.fortiss.af3.exploration.alg.dse.evaluator.constraint; + +import static java.lang.Math.pow; + +import java.util.ArrayList; +import java.util.Collection; + +import org.eclipse.emf.ecore.EObject; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.Partition; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.PartitionMappingEncoding; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.TaskMappingEncoding; +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; +import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter; +import org.fortiss.af3.exploration.alg.service.IExplorationTargetEvaluator; +import org.fortiss.af3.exploration.model.ExplorationConstraint; +import org.fortiss.af3.exploration.moea.model.predefined.NoEmptyPartitionConstraint; +import org.fortiss.tooling.common.util.LambdaUtils; +import org.opt4j.core.DoubleValue; +import org.opt4j.core.Value; + +import com.google.common.collect.ClassToInstanceMap; + +/** + * Adds a penalty for candidate solutions that contain empty partitions. + * + * @author diewald + */ +public class NoEmptyPartitionConstraintEvaluator extends + ConstraintEvaluatorBase<TaskMappingEncoding<?, ?>, Double, NoEmptyPartitionConstraint> { + /** {@inheritDoc} */ + @Override + public Value<?> evaluateGoal(TaskMappingEncoding<?, ?> phenotype, + FlatPhenotypeMap<Phenotype> phenotypeTypeMap, + ClassToInstanceMap<EObject> transformedModels) throws Exception { + PartitionMappingEncoding virtMapping = + phenotypeTypeMap.getEncoding(PartitionMappingEncoding.class); + assert (virtMapping != null); + + Collection<Partition> emptyPartitions = + LambdaUtils.filter(virtMapping.getRequesters(), res -> phenotype.getRequesters(res) + .isEmpty()); + return new DoubleValue(pow(10 * emptyPartitions.size(), 2)); + } + + /** {@inheritDoc} */ + @Override + public Collection<Class<?>> getRequiredInputTypes() { + Collection<Class<?>> requiredTypes = new ArrayList<>(); + requiredTypes.add(TaskMappingEncoding.class); + requiredTypes.add(PartitionMappingEncoding.class); + return requiredTypes; + } + + /** {@inheritDoc} */ + @Override + public Class<?> getPrimaryInputType() { + return TaskMappingEncoding.class; + } + + /** {@inheritDoc} */ + @Override + public boolean validateInputs() throws Exception { + return true; + } + + /** {@inheritDoc} */ + @Override + public boolean validateInternal(ExplorationConstraint<?> expTarget, + TaskMappingEncoding<?, ?> solution, Value<?> value) { + return value.getDouble() <= 10e-6; + } + + /** {@inheritDoc} */ + @Override + public + IExplorationTargetEvaluator<TaskMappingEncoding<?, ?>, Double, NoEmptyPartitionConstraint> + createEvaluator(SystemModelAdapter<?, ?, ?, ?, ?, ?, ?> systemModelAdapter, + NoEmptyPartitionConstraint explorationTarget) throws Exception { + return new NoEmptyPartitionConstraintEvaluator(); + } +} diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/objective/.ratings b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/objective/.ratings index 26142f29e2b2f091fa4aac3cd41d3201be310dd4..0341d8ab0c286f7cb99bd440a9203d2107e4a01b 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/objective/.ratings +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/objective/.ratings @@ -1,5 +1,5 @@ EnergyObjectiveEvaluator.java ad2b868aa3dce2c7708ee6cc90f357b79a4cf799 RED FailSilentReliabilityEvaluator.java 83211c8e2b69579c424a486cd6845bb8d1bb69fa RED FaultDetectionVotingReliabilityEvaluator.java 189fdfd0daed3348c510a6aeac0bd391e835c524 RED -MappingEvaluatorObjective.java 6ca3fa4dcbaeb61b38ad1d36a318dbb9ead58831 RED +MappingEvaluatorObjective.java 627aa735ebc2d04ed583ee68fd465d676a1008b6 RED ReliabilityEvaluatorBase.java 98fa54270cba25137112fe55f3551fbd8064ac28 RED diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/objective/MappingEvaluatorObjective.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/objective/MappingEvaluatorObjective.java index a93b07f5c1f06a19d776abb02cfbd68c3cf0bd93..17a9b315ed0385a1dca2a753118cae0e5f42af2b 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/objective/MappingEvaluatorObjective.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/objective/MappingEvaluatorObjective.java @@ -66,10 +66,12 @@ public class MappingEvaluatorObjective extends TaskMappingEvaluator { /** {@inheritDoc} */ @Override - public Value<?> evaluateGoal( - TaskMappingEncoding<ITaskAdapter<?>, TaskMappingEntry<ITaskAdapter<?>, Partition>> phenotype, - FlatPhenotypeMap<Phenotype> phenotypeTypeMap, - ClassToInstanceMap<EObject> transformedModels) throws Exception { + public + Value<?> + evaluateGoal( + TaskMappingEncoding<ITaskAdapter<?>, TaskMappingEntry<ITaskAdapter<?>, Partition>> phenotype, + FlatPhenotypeMap<Phenotype> phenotypeTypeMap, + ClassToInstanceMap<EObject> transformedModels) throws Exception { mapping = phenotype; virtMapping = phenotypeTypeMap.getEncoding(PartitionMappingEncoding.class); assert (virtMapping != null); @@ -110,10 +112,11 @@ public class MappingEvaluatorObjective extends TaskMappingEvaluator { /** {@inheritDoc} */ @Override - public IExplorationTargetEvaluator<TaskMappingEncoding<ITaskAdapter<?>, TaskMappingEntry<ITaskAdapter<?>, Partition>>, Double, ExplorationTarget<Double>> + public + IExplorationTargetEvaluator<TaskMappingEncoding<ITaskAdapter<?>, TaskMappingEntry<ITaskAdapter<?>, Partition>>, Double, ExplorationTarget<Double>> createEvaluator(SystemModelAdapter<?, ?, ?, ?, ?, ?, ?> systemModelAdapter, - ExplorationTarget<Double> explorationTarget) - throws InstantiationException, Exception { + ExplorationTarget<Double> explorationTarget) throws InstantiationException, + Exception { return new MappingEvaluatorObjective(systemModelAdapter, explorationTarget); } } diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/partition/PartitionTransformer.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/partition/PartitionTransformer.java index 57f0b38ee2e91fd1ad38abd07eb549a55542e97b..b3141909b0ac15837ecbfb8e4d72ab37bf75f7b2 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/partition/PartitionTransformer.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/partition/PartitionTransformer.java @@ -19,7 +19,6 @@ import static org.fortiss.af3.allocation.utils.AllocationModelElementFactory.cre import static org.fortiss.af3.allocation.utils.AllocationUtils.addAllocationEntry; import static org.fortiss.af3.exploration.alg.dse.modeltransformation.ITransformationModule.TransformationState.INITIALIZING; import static org.fortiss.af3.exploration.alg.util.TransformationUtils.getArchitectureOfAllocSuperSet; -import static org.fortiss.af3.partition.util.PartitionModelElementFactory.createTaskToPartitionAllocationTable; import static org.fortiss.tooling.common.util.LambdaUtils.getFirst; import java.util.Collection; @@ -47,7 +46,6 @@ import org.fortiss.af3.partition.util.PartitionModelElementFactory; import org.fortiss.af3.platform.model.PlatformArchitecture; import org.fortiss.af3.project.model.FileProject; import org.fortiss.af3.project.utils.ProjectUtils; -import org.fortiss.af3.task.model.Task; import org.fortiss.af3.task.model.TaskArchitecture; import org.fortiss.tooling.base.model.element.IHierarchicElement; import org.fortiss.tooling.common.util.LambdaUtils; @@ -79,11 +77,14 @@ public class PartitionTransformer extends TransformationModuleBase<AllocationTab TransformationState state, TransformationContext context, ExplorationTransformationInputs inputs, SubClassToInstanceMap<N> transformedModels, EObject outputModel) { - platfromArchitecture = getArchitectureOfAllocSuperSet( - inputs.getSuperSet(PartitionToExecutionUnitAllocationEntry.class), - PlatformArchitecture.class); - taskArchitecture = getArchitectureOfAllocSuperSet( - inputs.getSuperSet(TaskToPartitionAllocationEntry.class), TaskArchitecture.class); + platfromArchitecture = + getArchitectureOfAllocSuperSet( + inputs.getSuperSet(PartitionToExecutionUnitAllocationEntry.class), + PlatformArchitecture.class); + taskArchitecture = + getArchitectureOfAllocSuperSet( + inputs.getSuperSet(TaskToPartitionAllocationEntry.class), + TaskArchitecture.class); SuperSet<PartitionToExecutionUnitAllocationEntry> partToExU = inputs.getSuperSet(PartitionToExecutionUnitAllocationEntry.class); @@ -100,15 +101,16 @@ public class PartitionTransformer extends TransformationModuleBase<AllocationTab // Create the allocations. allocTableCollection = createAllocationTableCollection("Generated Allocations"); - TaskToPartitionAllocationTable taskExUTable = createTaskToExecutionUnitAllocationTable( - inputs.getSuperSet(TaskToPartitionAllocationEntry.class)); - modelContext.runAsNonDirtyingCommand( - () -> allocTableCollection.getContainedElements().add(taskExUTable)); + TaskToPartitionAllocationTable taskExUTable = + createTaskToPartitionAllocationTable(inputs + .getSuperSet(TaskToPartitionAllocationEntry.class)); + modelContext.runAsNonDirtyingCommand(() -> allocTableCollection.getContainedElements().add( + taskExUTable)); PartitionToExecutionUnitAllocationTable partExUTable = - createPartitionToExecutionUnitAllocationTable( - inputs.getSuperSet(PartitionToExecutionUnitAllocationEntry.class)); - modelContext.runAsNonDirtyingCommand( - () -> allocTableCollection.getContainedElements().add(partExUTable)); + createPartitionToExecutionUnitAllocationTable(inputs + .getSuperSet(PartitionToExecutionUnitAllocationEntry.class)); + modelContext.runAsNonDirtyingCommand(() -> allocTableCollection.getContainedElements().add( + partExUTable)); return allocTableCollection; } @@ -116,8 +118,9 @@ public class PartitionTransformer extends TransformationModuleBase<AllocationTab /** Creates a {@link PartitionArchitecture} from the entries in the given {@link SuperSet}. */ private void createPartitionArchitecture(SuperSet<Partition> partitions, ITopLevelElement modelContext) { - partitionArchitecture = PartitionModelElementFactory - .createPartitionArchitecture("Generated Partition Architecture"); + partitionArchitecture = + PartitionModelElementFactory + .createPartitionArchitecture("Generated Partition Architecture"); EList<IHierarchicElement> partitionList = partitionArchitecture.getContainedElements(); modelContext.runAsNonDirtyingCommand(() -> partitionList.addAll(partitions.getEntries())); } @@ -126,10 +129,11 @@ public class PartitionTransformer extends TransformationModuleBase<AllocationTab * Creates a {@link TaskToPartitionAllocationTable} from the corresponding entries in * the given {@link SuperSet}. */ - private TaskToPartitionAllocationTable createTaskToExecutionUnitAllocationTable( + private TaskToPartitionAllocationTable createTaskToPartitionAllocationTable( SuperSet<TaskToPartitionAllocationEntry> taskExecUnitAllocs) { TaskToPartitionAllocationTable table = - createTaskToPartitionAllocationTable("Generated Task->Part Table"); + org.fortiss.af3.partition.util.PartitionModelElementFactory + .createTaskToPartitionAllocationTable("Generated Task->Part Table"); table.setSourceView(taskArchitecture); table.setTargetView(partitionArchitecture); @@ -137,7 +141,7 @@ public class PartitionTransformer extends TransformationModuleBase<AllocationTab Partition af3Partition = (Partition)entry.getTargetElement(); // TODO: We assume single Tasks in this place. addAllocationEntry(table, TaskToPartitionAllocationEntry.class, - (Task)getFirst(entry.getSourceElements()).get(), af3Partition); + getFirst(entry.getSourceElements()).get(), af3Partition); } return table; } @@ -148,8 +152,9 @@ public class PartitionTransformer extends TransformationModuleBase<AllocationTab */ private PartitionToExecutionUnitAllocationTable createPartitionToExecutionUnitAllocationTable( SuperSet<PartitionToExecutionUnitAllocationEntry> partMapping) { - PartitionToExecutionUnitAllocationTable table = PartitionModelElementFactory - .createPartitionToExecutionUnitAllocationTable("Generated Part->ExU Table"); + PartitionToExecutionUnitAllocationTable table = + PartitionModelElementFactory + .createPartitionToExecutionUnitAllocationTable("Generated Part->ExU Table"); table.setSourceView(partitionArchitecture); table.setTargetView(platfromArchitecture);