diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/.ratings b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/.ratings index 2aec5eb27eea29d9d722f079bbbc86512a22b095..4e10012110a8f965b6c028198bbe6079e0edd62f 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/.ratings +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/.ratings @@ -1,5 +1,5 @@ CompositeExplorationSolution.java 1910fcd1d1e4a1b003b7a4e1bb52460eec5362dd RED -DSEFactory.java ae8a0f876a1db3372d116066db10aa1e736980ab RED +DSEFactory.java 1ae5fecb636a1a3eb8520d7906ad664828f22fe7 RED Explorer.java 91cdb26b6f42e4e5e82a26f7dbd9141ec2ff7b18 RED ImplicitExplorationTargetFactory.java 25c3c668ed268843f8af7e37eb03370ed513b482 RED SolutionQuantification.java 19cd7caa721bbca3112af7825c7fb20a96a4a799 RED diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/DSEFactory.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/DSEFactory.java index ae8a0f876a1db3372d116066db10aa1e736980ab..1ae5fecb636a1a3eb8520d7906ad664828f22fe7 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/DSEFactory.java +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/DSEFactory.java @@ -118,7 +118,8 @@ public class DSEFactory { * if (one of) the sub problem(s) cannot be registered. */ @SuppressWarnings("unchecked") - public <C, S extends InstantiatedTaskMappingEntry, T extends InstantiatedTaskMappingEncoding<S>> + public + <C, S extends InstantiatedTaskMappingEntry, T extends InstantiatedTaskMappingEncoding<S>> void createSubProblems(ArchitectureExplorationProblemModule archExpProblemModule, DseSpecification dse, DecoderDependencyGraph execDepGraph) throws Exception { // Java-limitation: it is not possible to pass the generic to the static methods. @@ -202,10 +203,11 @@ public class DSEFactory { ArchitectureExplorationProblemModule archExpProblemModule, DseSpecification dse, DecoderDependencyGraph execDepGraph) throws CycleFoundException { Class<PartitionMappingEncoding> pmEnodingClass = PartitionMappingEncoding.class; - PartitionMappingCreator pmCreator = new PartitionMappingCreator(execDepGraph, - (Collection<IExecutionUnitAdapter<?>>)(Collection<?>)systemModelAdapter - .getDeploymentTargets(), - systemModelAdapter.getDeployableComponents().size()); + PartitionMappingCreator pmCreator = + new PartitionMappingCreator(execDepGraph, + (Collection<IExecutionUnitAdapter<?>>)(Collection<?>)systemModelAdapter + .getDeploymentTargets(), systemModelAdapter + .getDeployableComponents().size()); @SuppressWarnings("rawtypes") List<ComposableDecoder> pmDecoders = new ArrayList<>(); PartitionMappingIdentityDecoder pmDecoder = new PartitionMappingIdentityDecoder(); @@ -229,17 +231,16 @@ public class DSEFactory { DecoderDependencyGraph execDepGraph) throws CycleFoundException { Class<PlatformCommunicationGraphEncoding> pmEnodingClass = PlatformCommunicationGraphEncoding.class; - PlatformCommunicationGraphCreator pmCreator = new PlatformCommunicationGraphCreator( - execDepGraph, - (Collection<IExecutionUnitAdapter<?>>)(Collection<?>)systemModelAdapter - .getDeploymentTargets(), - (Collection<IMemoryUnitAdapter<?>>)(Collection<?>)systemModelAdapter - .getMemoryUnits(), - (Collection<IGatewayUnitAdapter<?>>)(Collection<?>)systemModelAdapter - .getGatewayUnits(), - (Collection<ITransmissionUnitAdapter<?>>)(Collection<?>)systemModelAdapter - .getTransmissionUnits(), - systemModelAdapter.getResouceConnections()); + PlatformCommunicationGraphCreator pmCreator = + new PlatformCommunicationGraphCreator(execDepGraph, + (Collection<IExecutionUnitAdapter<?>>)(Collection<?>)systemModelAdapter + .getDeploymentTargets(), + (Collection<IMemoryUnitAdapter<?>>)(Collection<?>)systemModelAdapter + .getMemoryUnits(), + (Collection<IGatewayUnitAdapter<?>>)(Collection<?>)systemModelAdapter + .getGatewayUnits(), + (Collection<ITransmissionUnitAdapter<?>>)(Collection<?>)systemModelAdapter + .getTransmissionUnits(), systemModelAdapter.getResouceConnections()); @SuppressWarnings("rawtypes") List<ComposableDecoder> pmDecoders = new ArrayList<>(); PartitionMappingDecoderGraph pmgDecoder = new PartitionMappingDecoderGraph(); @@ -269,8 +270,8 @@ public class DSEFactory { @SuppressWarnings("unchecked") private <S extends InstantiatedTaskMappingEntry, T extends InstantiatedTaskMappingEncoding<S>> void createAbstractTaskMappingProblem(TaskMappingFactory<S, T> tmFactory, - ArchitectureExplorationProblemModule archExpProblemModule, DseSpecification dse, - DecoderDependencyGraph execDepGraph) throws Exception { + ArchitectureExplorationProblemModule archExpProblemModule, + DseSpecification dse, DecoderDependencyGraph execDepGraph) throws Exception { Class<AbstractTaskMappingEncoding> tmEnodingClass = AbstractTaskMappingEncoding.class; AbstractTaskMappingCreator tmCreator = tmFactory.createAbstractTaskMappingCreator(dse, execDepGraph); @@ -310,8 +311,8 @@ public class DSEFactory { @SuppressWarnings("unchecked") private <S extends InstantiatedTaskMappingEntry, T extends InstantiatedTaskMappingEncoding<S>> void createTaskMappingInstantiationProblem(TaskMappingFactory<S, T> tmFactory, - ArchitectureExplorationProblemModule archExpProblemModule, DseSpecification dse, - DecoderDependencyGraph execDepGraph) throws Exception { + ArchitectureExplorationProblemModule archExpProblemModule, + DseSpecification dse, DecoderDependencyGraph execDepGraph) throws Exception { // These suppress warnings are required since type erasure in Java does not allow to pass // XY<Z>.class. StrictTTDecoder<S, T> tmDecoder = tmFactory.createStrictTTDecoder(dse); @@ -352,8 +353,8 @@ public class DSEFactory { */ @SuppressWarnings("unchecked") public <S extends TaskMappingEntry<?, Partition>> - TaskMappingFactory<?, ? extends TaskMappingEncoding<?, S>> - createTaskMappingFactory(ExecutionModel execModel) throws UnsupportedDataTypeException { + TaskMappingFactory<?, ? extends TaskMappingEncoding<?, S>> createTaskMappingFactory( + ExecutionModel execModel) throws UnsupportedDataTypeException { // TODO: Remove the error-prone casting. Remove the differentiation between the failure // modes here as well? switch(execModel) { diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/.ratings b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/.ratings index a26bfd56e6210b6888f05e570b997c4787524e43..24e04a17f5caac674f22ccea57f4942d1318fa13 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/.ratings +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/.ratings @@ -1,3 +1,4 @@ +Opt4JDseTask.java b5cb9e664e7a8fc2b5157bcdcaca740c2fa85336 YELLOW Opt4JExplorationSolutionSet.java 8578ee9c438bc3327a64172e996306a89606c782 RED -Opt4JExplorerBackend.java 000231dcd7f3a76d06567c7bb987410fa80602ba RED +Opt4JExplorerBackend.java f5683ab89923cad54a07a15523216f096d225702 RED Opt4JSingleExplorationSolution.java 41ce92d11b2e7a6a8c39bffa990c691160c36c8d RED diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/Opt4JDseTask.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/Opt4JDseTask.java new file mode 100644 index 0000000000000000000000000000000000000000..b5cb9e664e7a8fc2b5157bcdcaca740c2fa85336 --- /dev/null +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/Opt4JDseTask.java @@ -0,0 +1,56 @@ +/*-------------------------------------------------------------------------+ +| 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.backend.opt4j; + +import org.opt4j.core.start.Opt4JTask; + +import com.google.inject.Inject; +import com.google.inject.Injector; +import com.google.inject.Provider; + +/** + * Specialized {@link Opt4JTask} that allows access to the {@link Injector} used in Opt4J to + * implement the dependency-driven decoding. + * This {@link Opt4JTask} implements a provider of the opt4J {@link Injector} in order to make it + * accessible for decoders and evaluators. An improvement to this generic {@link Injector} retrieval + * limited to Guice (Abstract)Modules that cannot be used here (no polymorphism in Java). + * + * @author diewald + */ +public class Opt4JDseTask extends Opt4JTask implements Provider<Injector> { + + /** No-arg constructor. */ + @Inject + public Opt4JDseTask() { + super(true); + } + + /** + * Constructs a {@link Opt4JTask}. + * + * @param closeOnStop + * close automatically after optimization + */ + public Opt4JDseTask(boolean closeOnStop) { + super(closeOnStop); + } + + /** {@inheritDoc} */ + @Override + public Injector get() { + return injector; + } +} diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/Opt4JExplorerBackend.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/Opt4JExplorerBackend.java index 000231dcd7f3a76d06567c7bb987410fa80602ba..f5683ab89923cad54a07a15523216f096d225702 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/Opt4JExplorerBackend.java +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/Opt4JExplorerBackend.java @@ -88,6 +88,8 @@ public class Opt4JExplorerBackend extends ExplorerBackendBase<EAOptimizer> { /** EA parameters. */ private EAOptimizer opt4JParameters; + // public static Injector DseInjector = Guice.createInjector(); + /** * Contains the problem module that includes the evaluators associated with the goals of the * DSE. @@ -227,7 +229,7 @@ public class Opt4JExplorerBackend extends ExplorerBackendBase<EAOptimizer> { modules.add(comp); // Create and initialize optimization task - opt4JTask = new Opt4JTask(false); + opt4JTask = new Opt4JDseTask(false); opt4JTask.init(modules); if(progressMonitor != null) { diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/create/.ratings b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/create/.ratings index c2b05422afb09e5baae3be83e84cf95a06a8a88e..3b4fc495bd41f35dfaead69c2ee2015a9c9875cc 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/create/.ratings +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/create/.ratings @@ -2,3 +2,4 @@ ComposableCreator.java 6d2d61205890a2b0b99f41d2caa4debc511c8b4a RED ComposableCreatorBase.java e1a898541dd2b480e6c345ad2429bf93393957e6 RED CompositeCreator.java bb054d281931f461ca67def20360cc767940e204 RED CompositeCreatorBase.java d897947ff0db02ea1cac4034a4912f9afce283ec RED +GuiceCreator.java 34e89e1ed5c8aa411b61682e84be0e9910533b3e RED diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/GuicePhenotype.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/create/GuiceCreator.java similarity index 76% rename from org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/GuicePhenotype.java rename to org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/create/GuiceCreator.java index 36deb82848fd14c0bf2649f9cb0553f24de68e9a..34e89e1ed5c8aa411b61682e84be0e9910533b3e 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/GuicePhenotype.java +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/create/GuiceCreator.java @@ -13,14 +13,21 @@ | See the License for the specific language governing permissions and | | limitations under the License. | +--------------------------------------------------------------------------*/ -package org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.decode; +package org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.create; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.PhenotypeBase; +import org.opt4j.core.genotype.IntegerGenotype; +import org.opt4j.core.problem.Creator; /** + * Dummy creator to allow registering the Guice Decoder. * * @author diewald */ -public class GuicePhenotype extends PhenotypeBase { +public class GuiceCreator implements Creator<IntegerGenotype> { + /** {@inheritDoc} */ + @Override + public IntegerGenotype create() { + return new IntegerGenotype(1, 10); + } } diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/.ratings b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/.ratings index 220d028a1c767d302ecbf263e91bfa99b18a77f6..302d891919976c4294beb477e112fd49f68a2858 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/.ratings +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/.ratings @@ -1,7 +1,6 @@ ComposableDecoder.java 0ef247e0e8424968cd8dab8317df0e504c5018d4 RED -ComposableDecoderBase.java 7a4c510bcdff54df5b27045d06db4ee923f995e2 RED +ComposableDecoderBase.java 7c47b41e609b6911128efa469c2dd65122276bcc RED CompositeDecoder.java 68864146cbd7b0d1444d4157cf88023deb4a21ea RED CompositeDecoderBase.java cc878483ec3dcf3afd60509579c7c17a3433893c RED -GuiceDecoder.java eb0fec9132b95dd8ecd07c134339ec93e9fbb3b7 RED -GuicePhenotype.java 36deb82848fd14c0bf2649f9cb0553f24de68e9a RED +GuiceDecoder.java 3fda47c70fa49cbe4398dc43e0819f2c6179202f RED PhenotypeDecoder.java 82766d64d8d6d0aa02078921517848c3585240a6 RED diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/ComposableDecoderBase.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/ComposableDecoderBase.java index 7a4c510bcdff54df5b27045d06db4ee923f995e2..7c47b41e609b6911128efa469c2dd65122276bcc 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/ComposableDecoderBase.java +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/ComposableDecoderBase.java @@ -22,6 +22,7 @@ import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegen import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.Phenotype; import com.google.common.reflect.TypeToken; +import com.google.inject.AbstractModule; /** * Base class for {@link ComposableDecoder}s. @@ -29,7 +30,7 @@ import com.google.common.reflect.TypeToken; * @author diewald */ public abstract class ComposableDecoderBase<G extends ComposableGenotype, P extends Phenotype> - implements ComposableDecoder<G, P> { + extends AbstractModule implements ComposableDecoder<G, P> { /** Type information: Concrete input genotype of the decoder. */ private TypeToken<G> genotype = new TypeToken<G>(getClass()) { // Empty class }; @@ -37,6 +38,12 @@ public abstract class ComposableDecoderBase<G extends ComposableGenotype, P exte private TypeToken<P> phenotype = new TypeToken<P>(getClass()) { // Empty class }; + /** {@inheritDoc} */ + @Override + public void configure() { + // Nothing to be done here by default. + } + /** {@inheritDoc} */ @Override public Class<?> getPrimaryInputType() { diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/GuiceDecoder.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/GuiceDecoder.java index eb0fec9132b95dd8ecd07c134339ec93e9fbb3b7..3fda47c70fa49cbe4398dc43e0819f2c6179202f 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/GuiceDecoder.java +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/GuiceDecoder.java @@ -15,33 +15,75 @@ +--------------------------------------------------------------------------*/ package org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.decode; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.TaskMappingEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.Phenotype; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.taskmapping.instantiate.FailSilentAbstractTaskMappingDecoder; import org.opt4j.core.Genotype; import org.opt4j.core.problem.Decoder; +import org.opt4j.core.start.Opt4JTask; +import com.google.inject.AbstractModule; import com.google.inject.Inject; import com.google.inject.Injector; +import com.google.inject.Provides; /** + * {@link Decoder} that handles dependencies between {@link Decoder}s, {@link Genotype}s, and + * {@link Phenotype}s using the Guice framework. * * @author diewald */ -public class GuiceDecoder implements Decoder<Genotype, GuicePhenotype> { - - protected GuicePhenotype composedPhenotype; +public class GuiceDecoder extends AbstractModule implements Decoder<Genotype, Phenotype> { + /** Resulting phenotype from the decoding phase that is composed of sub-{@link Phenotype}s. */ @Inject - Class<Phenotype> resultType; + protected Phenotype composedPhenotype; + + /** Defines the desired exploration result type. */ + // TODO: Remove this hard coded line and get the desired result from the backend interface. + protected Class<? extends Phenotype> resultType = TaskMappingEncoding.class; + /** Injector created by the {@link Opt4JTask}. */ @Inject - protected Injector decoderInjector; + protected Injector opt4JInjector; + + /** Child injector for the dependency management of the decode phase. */ + protected Injector decodingInjector; + + /** Reference to the input {@link Genotype}. */ + protected Genotype genotype; + + // TODO: Switch from field injections to Constructor injection as far as possible. + // /** Constructor. */ + // @Inject + // public GuiceDecoder(Injector opt4JInjector) { + // decoderInjector = opt4JInjector; + // } /** {@inheritDoc} */ @Override - public GuicePhenotype decode(Genotype genotype) { + public Phenotype decode(Genotype genotype) { // The decode operations are responsible to add the results of the decode operation to the // parent phenotype. - Phenotype resultPhenotype = decoderInjector.getInstance(resultType); + this.genotype = genotype; + // TODO(AD): See configure(): We need a service machenism and user configuration to select + // the desired set of activated decoders. + decodingInjector = opt4JInjector.createChildInjector(this); + decodingInjector.getInstance(resultType); return composedPhenotype; } + + /** Provides the composite {@link Genotype} as required by the Guice framework. */ + @Provides + public Genotype getGenotype() { + return genotype; + } + + /** {@inheritDoc} */ + @Override + protected void configure() { + // TODO(AD): we need to implement a service mechanism in this configure method. (Plugin + // Style) + bind(TaskMappingEncoding.class).toProvider(FailSilentAbstractTaskMappingDecoder.class); + } } diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/.ratings b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/.ratings index 6161d37794c8526b5c4e3c5ac5b12bb8b2ae9404..15dced9b28000c2b2e438e8c7041aef0e88fd9c0 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/.ratings +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/.ratings @@ -1,8 +1,8 @@ ArchExpSubDecoder.java 8878133e8b65858b4cd7cedd243d49d391066323 RED ArchitectureDecoder.java d067dc995e0895860d98d717647c0f7b061f5908 RED -ArchitectureExplorationProblemModule.java 6a8f34a29885d14c6f96e7516d23b30a646cd032 RED +ArchitectureExplorationProblemModule.java a1c6b8ced3b1bf54ce9d9b957b0f4c80a821bdab RED DseProblemModuleBase.java 0eba41852529e92e7255c7a7d8fce18354facbca RED EvaluatorWrapper.java 3747e5b78b1dcef8e1595c1ae9354e8ef2738e79 RED ExplorationGoalPriorityMultiEvaluator.java 1f6d2aa6ece8acdf4f57face0439f3429ab87329 RED -ProblemModuleBase.java 4d5c2a80cada7ba6e4722c27f4625777ee0bbd87 RED +ProblemModuleBase.java e776938a9d2cc2a40e559c266b5c7bf405cb3eec RED StrictTTDecoder.java d44d02b5f866717ebaa40a8a1a32225852e56af8 RED diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/ArchitectureExplorationProblemModule.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/ArchitectureExplorationProblemModule.java index 6a8f34a29885d14c6f96e7516d23b30a646cd032..a1c6b8ced3b1bf54ce9d9b957b0f4c80a821bdab 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/ArchitectureExplorationProblemModule.java +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/ArchitectureExplorationProblemModule.java @@ -21,6 +21,8 @@ import java.util.Set; import org.fortiss.af3.exploration.alg.dse.DSEFactory; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.ArchitectureExplorationEncoding; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.create.GuiceCreator; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.decode.GuiceDecoder; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.graph.DecoderDependencyGraph; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.solution.ArchitectureSolution; import org.fortiss.af3.exploration.alg.dse.evaluator.ArchitectureEvaluator; @@ -34,7 +36,8 @@ import org.fortiss.af3.exploration.moea.model.DseSpecification; * * @author huang */ -public class ArchitectureExplorationProblemModule extends +public class ArchitectureExplorationProblemModule + extends DseProblemModuleBase<ArchitectureExplorationEncoding, ArchitectureSolution, ArchitectureDecoder> { DSEFactory dseFactory = DSEFactory.getInstance(); @@ -65,12 +68,14 @@ public class ArchitectureExplorationProblemModule extends DecoderDependencyGraph execDepGraph = new DecoderDependencyGraph(requestedSolutions); // TODO: construct the execution dependency graph elsewhere? - bindProblem(dseFactory.createArchitectureExplorationCreator(), - dseFactory.createArchitectureDecoder(execDepGraph), archEvaluator); + // bindProblem(dseFactory.createArchitectureExplorationCreator(), + // dseFactory.createArchitectureDecoder(execDepGraph), archEvaluator); + + bindProblem(new GuiceCreator(), new GuiceDecoder(), archEvaluator); // Create/Bind the subproblems of the architectural exploration problem. try { - dseFactory.createSubProblems(this, dse, execDepGraph); + // dseFactory.createSubProblems(this, dse, execDepGraph); } catch(Exception e) { throw new RuntimeException("Failed setting up the DSE Problem instance.", e); } @@ -78,6 +83,8 @@ public class ArchitectureExplorationProblemModule extends // Create evaluators wrappers (based on provided goal specification) try { addGoalEvaluators(archEvaluator); + // addGoalEvaluator(new EnergyObjectiveEvaluator(), + // PredefinedFactory.eINSTANCE.createEnergyMinObjective(), 0); } catch(Exception e) { throw rethrow(e); } diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/ProblemModuleBase.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/ProblemModuleBase.java index 4d5c2a80cada7ba6e4722c27f4625777ee0bbd87..e776938a9d2cc2a40e559c266b5c7bf405cb3eec 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/ProblemModuleBase.java +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/ProblemModuleBase.java @@ -124,31 +124,30 @@ public abstract class ProblemModuleBase<G extends Genotype, R extends Creator<G> multibinder.addBinding().toInstance((Evaluator<Object>)evaluator); } - /** Registers a pre-constructor creator and decoder with the Opt4J engine. */ - @SuppressWarnings("unchecked") - protected void bindProblem(R creator, D decoder) { - registerCreatorDecoder(creator, decoder); - - // This is inspired from ProblemModule.bindProblem(), which does not allow to pass - // parameters to the constructor of the creators/decoders. Hence, a pre-constructed - // creator/decoder is bound here. - - // Note that in contrast to ProblemModule.bindProblem(), the creator and the decoder - // are not bound in the singleton scope, since these classes need to be parameterized - // with the current input model. - binder().bind(new TypeLiteral<Creator<Genotype>>() { // empty - }).toInstance((Creator<Genotype>)creator); + // /** Registers a pre-constructor creator and decoder with the Opt4J engine. */ + // @SuppressWarnings("unchecked") + // protected void bindProblem(R creator, D decoder) { + // registerCreatorDecoder(creator, decoder); + // + // // This is inspired from ProblemModule.bindProblem(), which does not allow to pass + // // parameters to the constructor of the creators/decoders. Hence, a pre-constructed + // // creator/decoder is bound here. + // + // // Note that in contrast to ProblemModule.bindProblem(), the creator and the decoder + // // are not bound in the singleton scope, since these classes need to be parameterized + // // with the current input model. + // binder().bind(new TypeLiteral<Creator<Genotype>>() { // empty + // }).toInstance((Creator<Genotype>)creator); + // + // binder().bind(new TypeLiteral<Decoder<Genotype, Object>>() { // empty + // }).toInstance((Decoder<Genotype, Object>)decoder); + // } - binder().bind(new TypeLiteral<Decoder<Genotype, Object>>() { // empty - }).toInstance((Decoder<Genotype, Object>)decoder); - } - - /** Registers a pre-constructor creator, decoder, and evaluator with the Opt4J engine. */ + /** Registers a pre-constructor creator and decoder with the Opt4J engine. */ @SuppressWarnings("unchecked") - // TODO: remove casts and rethrow the exception. - protected - void bindProblem(R creator, D decoder, Evaluator<? extends Phenotype> evaluator) { - registerCreatorDecoder(creator, decoder); + protected void bindProblem(Creator creator, Decoder decoder, + Evaluator<? extends Phenotype> evaluator) { + registerCreatorDecoder((R)creator, (D)decoder); // This is inspired from ProblemModule.bindProblem(), which does not allow to pass // parameters to the constructor of the creators/decoders. Hence, a pre-constructed @@ -166,6 +165,29 @@ public abstract class ProblemModuleBase<G extends Genotype, R extends Creator<G> addEvaluator(evaluator); } + // /** Registers a pre-constructor creator, decoder, and evaluator with the Opt4J engine. */ + // @SuppressWarnings("unchecked") + // // TODO: remove casts and rethrow the exception. + // protected + // void bindProblem(R creator, D decoder, Evaluator<? extends Phenotype> evaluator) { + // registerCreatorDecoder(creator, decoder); + // + // // This is inspired from ProblemModule.bindProblem(), which does not allow to pass + // // parameters to the constructor of the creators/decoders. Hence, a pre-constructed + // // creator/decoder is bound here. + // + // // Note that in contrast to ProblemModule.bindProblem(), the creator and the decoder + // // are not bound in the singleton scope, since these classes need to be parameterized + // // with the current input model. + // binder().bind(new TypeLiteral<Creator<Genotype>>() { // empty + // }).toInstance((Creator<Genotype>)creator); + // + // binder().bind(new TypeLiteral<Decoder<Genotype, Object>>() { // empty + // }).toInstance((Decoder<Genotype, Object>)decoder); + // + // addEvaluator(evaluator); + // } + /** * Stores the associated creator and decoder at this class, if they are not already set. (They * might be set for this {@link ProblemModule} already, if multiple {@link Evaluator}s are diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/.ratings b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/.ratings index 8ac9f6e4eeab6d8ef93f57e8bc053e1793ff87f6..d486787fa471036493ae4a60895f5f999c18a123 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/.ratings +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/.ratings @@ -1,4 +1,4 @@ -SFEncodingDecoder.java 38d5a6c261315d2fd24f06f764c97e9d9f6808db RED +SFEncodingDecoder.java 35536dec62c42b3acfc3a53973e804e238cfdad2 RED SFGraphDecoder.java 82c9b536a526e0e2b23d35a64124e622e5eedd5a RED SFMappingConstraintDecoder.java 69b46dc6184f316102df770ebad3814361db6d11 RED SFMappingDecoder.java 0fe8c6aad79085a5be5ead4c38b21e06095944a9 RED diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFEncodingDecoder.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFEncodingDecoder.java index f7c4dfe77f156aa805aba30e8be152da07cb2549..35536dec62c42b3acfc3a53973e804e238cfdad2 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFEncodingDecoder.java +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFEncodingDecoder.java @@ -33,8 +33,8 @@ import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.ArchExpSubDecod * @author diewald */ public class SFEncodingDecoder<C> extends - ComposableDecoderBase<SafetyFunctionArchEncoding<C>, SafetyFunctionArchEncoding> implements - ArchExpSubDecoder { + ComposableDecoderBase<SafetyFunctionArchEncoding<C>, SafetyFunctionArchEncoding<C>> + implements ArchExpSubDecoder { /** * {@inheritDoc} diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/.ratings b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/.ratings index 5d7a238a32e58d25ee8cfa76e276a15bf7b48e18..8650e32c0178294d843efb6472ec91ebf0a4893c 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/.ratings +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/.ratings @@ -1,4 +1,4 @@ -AbstractTaskMappingDecoder.java 52a08984ae1270bba11cf3a215009c9d8c1f9a17 RED -FailSilentAbstractTaskMappingDecoder.java 0d68a832a1e9bca8ef93aaffb9d309c1fe7d7f7a RED +AbstractTaskMappingDecoder.java 8f42a638ceeba220da3a22f281ce08fe0764934b RED +FailSilentAbstractTaskMappingDecoder.java f5a3160d8b34da3f5c1e77d370af98670d694923 RED FaultDetectionVotingAbstractTaskMappingDecoder.java 91ad48817fdd592a70da6a08d4a0f666c01acc33 RED TaskInstanceResourceAlignmentDecoder.java fe8b789f3a0185585a90cf1882fd3983453b4a0d RED diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/AbstractTaskMappingDecoder.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/AbstractTaskMappingDecoder.java index 52a08984ae1270bba11cf3a215009c9d8c1f9a17..8f42a638ceeba220da3a22f281ce08fe0764934b 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/AbstractTaskMappingDecoder.java +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/AbstractTaskMappingDecoder.java @@ -28,8 +28,6 @@ import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.ArchExpSubDecod import org.fortiss.af3.exploration.moea.model.DseSpecification; import org.opt4j.core.problem.Decoder; -import com.google.inject.Inject; - /** * Base class for {@link Decoder}s that instantiate {@link AbstractTaskMappingEncoding}s to * {@link InstantiatedTaskMappingEncoding}. @@ -42,7 +40,6 @@ public abstract class AbstractTaskMappingDecoder<S extends InstantiatedTaskMappi DseSpecification explorationDefinition; /** Constructs a new decoder that instantiates {@link AbstractTaskMappingEncoding}. */ - @Inject public AbstractTaskMappingDecoder(DseSpecification explorationDefinition) { this.explorationDefinition = explorationDefinition; } diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/FailSilentAbstractTaskMappingDecoder.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/FailSilentAbstractTaskMappingDecoder.java index 0d68a832a1e9bca8ef93aaffb9d309c1fe7d7f7a..f5a3160d8b34da3f5c1e77d370af98670d694923 100644 --- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/FailSilentAbstractTaskMappingDecoder.java +++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/FailSilentAbstractTaskMappingDecoder.java @@ -22,6 +22,7 @@ import java.util.Collection; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.PartitionMappingEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskgraph.AbstractTaskGraphEncoding; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.TaskMappingEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.abstractmapping.AbstractTaskMappingEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.abstractmapping.AbstractTaskMappingEntry; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping.FailSilentTaskMappingEncoding; @@ -33,6 +34,10 @@ import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegen import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.ITaskAdapter; import org.fortiss.af3.exploration.moea.model.DseSpecification; +import com.google.inject.Inject; +import com.google.inject.Provider; +import com.google.inject.Provides; + /** * Decoder for instantiating an {@link AbstractTaskMappingEncoding} to a * {@link FailSilentTaskMappingEncoding}. @@ -41,25 +46,37 @@ import org.fortiss.af3.exploration.moea.model.DseSpecification; */ // FIXME: The type hierarchy and naming of the classes is extremely confusing. FIX ASAP! public class FailSilentAbstractTaskMappingDecoder extends - AbstractTaskMappingDecoder<FailSilentTaskMappingEntry, FailSilentTaskMappingEncoding> { + AbstractTaskMappingDecoder<FailSilentTaskMappingEntry, FailSilentTaskMappingEncoding> + implements Provider<TaskMappingEncoding> { + + /** Input task mapping that may contain components which need to be instantiated. */ + @Inject + AbstractTaskMappingEncoding atmEnc; + + /** Input task graph to perform the mapping. */ + @Inject + AbstractTaskGraphEncoding<?, ?> atgEnc; + + /** + * Input mapping of partitions to executions units. This step maps to partitions encoded here. + * Additionally, information about the phys. executor may be required for smart mapping + * decisions. + */ + @Inject + PartitionMappingEncoding partEnc; /** Constructor. */ + @Inject public FailSilentAbstractTaskMappingDecoder(DseSpecification explorationDefinition) { super(explorationDefinition); } /** {@inheritDoc} */ @Override + @Provides public FailSilentTaskMappingEncoding decodeComposable(AbstractTaskMappingEncoding genotype, FlatPhenotypeMap<Phenotype> phenotypeTypeMap) { - assert (false); - AbstractTaskGraphEncoding<?, ?> atgEnc = - phenotypeTypeMap.getEncoding(AbstractTaskGraphEncoding.class); - assert (atgEnc != null) : "The required abstract task graph encoding could not be found in the map of already decoded phenotypes."; - PartitionMappingEncoding partEnc = - phenotypeTypeMap.getEncoding(PartitionMappingEncoding.class); - assert (partEnc != null) : "The required partition mapping encoding could not be found in the map of already decoded phenotypes."; - return new FailSilentTaskMappingEncoding(explorationDefinition, partEnc, atgEnc, genotype); + return new FailSilentTaskMappingEncoding(explorationDefinition, partEnc, atgEnc, atmEnc); } // TODO: Abstract to the AbstractTaskMappingDecoder. @@ -70,9 +87,10 @@ public class FailSilentAbstractTaskMappingDecoder extends * see {@link ComposableDecoder}. */ @Override - public FailSilentTaskMappingEncoding updateComposable(AbstractTaskMappingEncoding inGenotype, - FailSilentTaskMappingEncoding outGenotype, - FlatPhenotypeMap<Phenotype> decodedPhenotypes) throws DecodingException { + public FailSilentTaskMappingEncoding + updateComposable(AbstractTaskMappingEncoding inGenotype, + FailSilentTaskMappingEncoding outGenotype, + FlatPhenotypeMap<Phenotype> decodedPhenotypes) throws DecodingException { outGenotype.replaceConstraints(inGenotype.getConstraints()); for(ITaskAdapter<?> comp : inGenotype.getRequesters()) { @@ -80,8 +98,9 @@ public class FailSilentAbstractTaskMappingDecoder extends inGenotype.getMappingEntriesOf(comp); Collection<FailSilentTaskMappingEntry> instEntries; if(comp.isInstantiationRequired()) { - instEntries = filterSet(outGenotype.getMappingEntries(), - e -> e.getSource().getReplacedComponent() == comp); + instEntries = + filterSet(outGenotype.getMappingEntries(), e -> e.getSource() + .getReplacedComponent() == comp); } else { instEntries = outGenotype.getMappingEntriesOf(comp); } @@ -117,8 +136,8 @@ public class FailSilentAbstractTaskMappingDecoder extends rmTasks.forEach(e -> outGenotype.removeTask(e)); for(FailSilentTaskMappingEntry entry : outGenotype.getMappingEntries()) { - entry.resetTarget( - entry.getAssociatedElement(AbstractTaskMappingEntry.class).getTarget()); + entry.resetTarget(entry.getAssociatedElement(AbstractTaskMappingEntry.class) + .getTarget()); } return outGenotype; @@ -129,4 +148,12 @@ public class FailSilentAbstractTaskMappingDecoder extends public Class<?> getPrimaryInputType() { return AbstractTaskMappingEncoding.class; } + + // TODO: The list of parameters injected into the decodeComposable call should be 0, use fields + // for now. + /** {@inheritDoc} */ + @Override + public TaskMappingEncoding get() { + return decodeComposable(null, null); + } }