diff --git a/org.fortiss.af3.exploration.alg/trunk/model/moea.ecore b/org.fortiss.af3.exploration.alg/trunk/model/moea.ecore index deaa938beee729e071e2e604add78b6a0cdb0ef6..099cf6fd45522f4b427d21f6bca28ec493e36c35 100644 --- a/org.fortiss.af3.exploration.alg/trunk/model/moea.ecore +++ b/org.fortiss.af3.exploration.alg/trunk/model/moea.ecore @@ -373,5 +373,10 @@ <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDoubleObject"/> </eGenericSuperTypes> </eClassifiers> + <eClassifiers xsi:type="ecore:EClass" name="SameSilInPartitionConstraint"> + <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 e7b653e7fd63aaec8d2fbe82b88323277751dc3a..ba106c86ef8c122fe4dcf9eda2f701f78212aba2 100644 --- a/org.fortiss.af3.exploration.alg/trunk/model/moea.genmodel +++ b/org.fortiss.af3.exploration.alg/trunk/model/moea.genmodel @@ -119,6 +119,7 @@ <genTypeParameters ecoreTypeParameter="moea.ecore#//predefined/SafetyComparison/T"/> </genClasses> <genClasses ecoreClass="moea.ecore#//predefined/NoEmptyPartitionConstraint"/> + <genClasses ecoreClass="moea.ecore#//predefined/SameSilInPartitionConstraint"/> </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 37eedf75e878ff238a6674438b802e9201975f3f..4337d6a40fb718928c3bfeb0917daae52e183e57 100644 --- a/org.fortiss.af3.exploration.alg/trunk/plugin.xml +++ b/org.fortiss.af3.exploration.alg/trunk/plugin.xml @@ -267,7 +267,13 @@ <evaluator module="org.fortiss.af3.exploration.alg.dse.evaluator.constraint.NoEmptyPartitionConstraintEvaluator"> <modelElementClass - modelElementClass="org.fortiss.af3.exploration.model.ExplorationConstraint"> + modelElementClass="org.fortiss.af3.exploration.moea.model.predefined.NoEmptyPartitionConstraint"> + </modelElementClass> + </evaluator> + <evaluator + module="org.fortiss.af3.exploration.alg.dse.evaluator.constraint.SameSilInPartitionConstraintEvaluator"> + <modelElementClass + modelElementClass="org.fortiss.af3.exploration.moea.model.predefined.SameSilInPartitionConstraint"> </modelElementClass> </evaluator> <evaluator 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 66e9ccf83a50dcbbfc94ef67ad9bc814a6617c5a..08035aab4f6d654cecb53e128dbd550023890788 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 c35b0b0cf5658300b5e8c4f2cc9e217c29ae37a3 RED DSEFactory.java 0a2f2cc6a197e760c1f8223339ffa5f16856b184 RED Explorer.java 2194a74cbe51ca9e7dafb008dcefb51a54064dc8 RED -ImplicitExplorationTargetFactory.java e45c6c3344b46a275e2c74b5c714900229f5f8d3 RED +ImplicitExplorationTargetFactory.java 6c16c6712886b549dda0a73aef4a4c3fe18c1850 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/ImplicitExplorationTargetFactory.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/ImplicitExplorationTargetFactory.java index 5e0cedafb0e14a9f8b6ecd67a15678423c2bdee7..25c3c668ed268843f8af7e37eb03370ed513b482 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 @@ -75,6 +75,7 @@ public class ImplicitExplorationTargetFactory { Collection<ExplorationConstraint<?>> constraints = new ArrayList<>(); // constraints.addAll(createPeriodConstraints(systemModelAdapter)); constraints.add(createNoEmptyPartitionConstraint()); + constraints.add(createSameSilInPartitionConstraint()); // Reassign the ids of generated constraints. By default, they are set to 0. Each constraint // needs a "unique" id for its constraint type. @@ -95,6 +96,11 @@ public class ImplicitExplorationTargetFactory { return PredefinedFactory.eINSTANCE.createNoEmptyPartitionConstraint(); } + /** Creates a single constraint that states a partition may only host tasks with the same SIL. */ + private static ExplorationConstraint<?> createSameSilInPartitionConstraint() { + return PredefinedFactory.eINSTANCE.createSameSilInPartitionConstraint(); + } + /** * Creates a {@link PeriodConstraint} for each {@link TaskGraph} present in the * {@link SystemModelAdapter}. 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 eaa395c52e8efeaf9ca96d72100478cca5356a6d..eaab550c897663de709b8b1800691fcee3e5c3eb 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 @@ -7,3 +7,4 @@ MappingEvaluatorConstraint.java f1f44bffbef03f1650a7f026428423838b16b845 RED NoEmptyPartitionConstraintEvaluator.java 33f7b4215b2ada1e60474e9385150a9ea234b060 YELLOW PeriodConstraintEvaluator.java 05cf21be06c9ae12593f870efdf9c358efa2d97c RED SafetyIntegrityLevelConstraintEvaluator.java 9ad7129faaa35d89af4fced7a7121a0a142cb6f1 RED +SameSilInPartitionConstraintEvaluator.java 9f30f5731fb64b73ab2c50868026e9d1af05beb5 RED diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/SameSilInPartitionConstraintEvaluator.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/SameSilInPartitionConstraintEvaluator.java new file mode 100644 index 0000000000000000000000000000000000000000..0c371e2a153c275656f52540eb12ec91030cb1fc --- /dev/null +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/SameSilInPartitionConstraintEvaluator.java @@ -0,0 +1,121 @@ +/*-------------------------------------------------------------------------+ +| 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.abs; +import static java.lang.Math.expm1; +import static org.fortiss.tooling.common.util.LambdaUtils.getFirst; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Optional; + +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.taskmapping.TaskMappingEncoding; +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; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.Phenotype; +import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.ITaskAdapter; +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.SameSilInPartitionConstraint; +import org.opt4j.core.DoubleValue; +import org.opt4j.core.Value; + +import com.google.common.collect.ClassToInstanceMap; + +/** + * Evaluates whether all {@link ITaskAdapter}s mapped to {@link Partition}s have the same + * SIL/ASIL/DAL value and calculates a penality based on the difference in the Integrity Levels of + * the tasks. + * + * @author diewald + */ +public class SameSilInPartitionConstraintEvaluator + extends + ConstraintEvaluatorBase<TaskMappingEncoding<ITaskAdapter<?>, InstantiatedTaskMappingEntry>, Double, SameSilInPartitionConstraint> { + + /** {@inheritDoc} */ + @Override + public Value<?> evaluateGoal( + TaskMappingEncoding<ITaskAdapter<?>, InstantiatedTaskMappingEntry> phenotype, + FlatPhenotypeMap<Phenotype> phenotypeTypeMap, + ClassToInstanceMap<EObject> transformedModels) throws Exception { + double resVal = 0.0; + for(Partition partition : phenotype.getResources()) { + // FIXME: remove casts by specifying the TaskMapping. + Collection<ITaskAdapter<?>> allocatedTasks = phenotype.getRequesters(partition); + Optional<ITaskAdapter<?>> anyTask = getFirst(allocatedTasks); + if(!anyTask.isPresent()) { + continue; + } + + int derivationSum = 0; + int firstSilVal = anyTask.get().getRequiredSafetyIntegrityLevel().getValue(); + for(ITaskAdapter<?> task : allocatedTasks) { + int currentSilVal = task.getRequiredSafetyIntegrityLevel().getValue(); + derivationSum += abs(firstSilVal - currentSilVal); + } + + // TODO: Will the evaluator perform more efficiently if the penalty function is + // calculated over the sum of violation of partitions, or (as it is now) a sum over the + // penalties per partition mismatch. + resVal += expm1(derivationSum); + } + System.out.println("ResVal: " + resVal); + return new DoubleValue(resVal); + } + + /** {@inheritDoc} */ + @Override + public boolean validateInputs() throws Exception { + return true; + } + + /** {@inheritDoc} */ + @Override + public Collection<Class<?>> getRequiredInputTypes() { + Collection<Class<?>> inputs = new ArrayList<>(); + inputs.add(TaskMappingEncoding.class); + return inputs; + } + + /** {@inheritDoc} */ + @Override + public Class<?> getPrimaryInputType() { + return TaskMappingEncoding.class; + } + + /** {@inheritDoc} */ + @Override + public + IExplorationTargetEvaluator<TaskMappingEncoding<ITaskAdapter<?>, InstantiatedTaskMappingEntry>, Double, SameSilInPartitionConstraint> + createEvaluator(SystemModelAdapter<?, ?, ?, ?, ?, ?, ?> systemModelAdapter, + SameSilInPartitionConstraint explorationTarget) throws Exception { + return new SameSilInPartitionConstraintEvaluator(); + } + + /** {@inheritDoc} */ + @Override + public boolean validateInternal(ExplorationConstraint<?> expTarget, + TaskMappingEncoding<ITaskAdapter<?>, InstantiatedTaskMappingEntry> solution, + Value<?> value) { + return value.getDouble() <= 10e-6; + } + +} diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/af3/.ratings b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/af3/.ratings index ca703dc54a8ac9ec360e9bdfa238b8c71be54cb9..2a9765d66a13181280faa6a05665018dcfa712fd 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/af3/.ratings +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/af3/.ratings @@ -9,5 +9,5 @@ AF3ResourceAdapter.java 00070d4e3ec7f19a672b6295c546fa1d30d7fc50 RED AF3ResourceConnectionAdapter.java 0e791fd7d9602f4cf00f54c6254d31f1c9cc72b0 RED AF3SignalAdapter.java bc102b65b929393808eb747572f9ae05b04a8856 RED AF3SystemModelAdapter.java e6ea1aaae3c4867cfc38487d7534e847794fdb82 RED -AF3TaskAdapter.java ac021d7af31888d89d1cb58ec64bf7f551da160b RED +AF3TaskAdapter.java e59896eeb0a268435075474947a51fa0689df554 RED AF3TransmissionUnitAdapter.java 0ce1a08c29d75a05fb49668d02abddd852487a4c RED diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/af3/AF3TaskAdapter.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/af3/AF3TaskAdapter.java index dc745b260ba28a63b1ed5fec59f776d789f7af57..4ee4e1bcf1f4780f0a4f069d1a0bcf177a241dc7 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/af3/AF3TaskAdapter.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/af3/AF3TaskAdapter.java @@ -66,8 +66,8 @@ public class AF3TaskAdapter extends AF3RequestAdapter<Task> implements ITaskAdap private Collection<ITaskAdapter<Component>> replacementComponents; /** - * "Trace" to the {@link ITaskAdapter} which {@code this} - * {@link ITaskAdapter} replaced (if applicable). + * "Trace" to the {@link ITaskAdapter} which {@code this} {@link ITaskAdapter} replaced (if + * applicable). */ private ITaskAdapter<Component> replacedComponent; @@ -89,7 +89,7 @@ public class AF3TaskAdapter extends AF3RequestAdapter<Task> implements ITaskAdap "A non-specified period value and negative periods are not allowed."); } period = af3Period.doubleValue(); - sil = getAnnotationChecked(af3Task, SafetyIntegrityLevel.class); + sil = getAnnotationChecked(af3Component, SafetyIntegrityLevel.class); ReplicationBounds replicationSpec = getAnnotationChecked(af3Task, ReplicationBounds.class); minReplication = replicationSpec.getMinReplication(); maxReplication = replicationSpec.getMaxReplication();