diff options
author | Ed Willink | 2016-01-11 12:49:55 +0000 |
---|---|---|
committer | Ed Willink | 2016-01-12 13:56:16 +0000 |
commit | 13ec534a6bf8dc8e4b1cce9bcc74f4788a845eea (patch) | |
tree | 6b780d136226220082ff0d03a6ae198ddbb4d37a | |
parent | 78431c9c7904149bfc9b0eec39fbf95aa54cbac7 (diff) | |
download | org.eclipse.qvtd-13ec534a6bf8dc8e4b1cce9bcc74f4788a845eea.tar.gz org.eclipse.qvtd-13ec534a6bf8dc8e4b1cce9bcc74f4788a845eea.tar.xz org.eclipse.qvtd-13ec534a6bf8dc8e4b1cce9bcc74f4788a845eea.zip |
[485165] Add more scheduler debug options
5 files changed, 102 insertions, 3 deletions
diff --git a/plugins/org.eclipse.qvtd.compiler/.options b/plugins/org.eclipse.qvtd.compiler/.options index d6449fdb6..101149c54 100644 --- a/plugins/org.eclipse.qvtd.compiler/.options +++ b/plugins/org.eclipse.qvtd.compiler/.options @@ -2,6 +2,16 @@ # Turn on tracing of the operation dependency analysis org.eclipse.qvtd.compiler/qvtp2qvts/dependencyAnalysis=false +# Turn on dump of the consuming node for each class +org.eclipse.qvtd.compiler/qvtp2qvts/dump/class2consumingNodes=false +# Turn on dump of the consumed properties analysis +org.eclipse.qvtd.compiler/qvtp2qvts/dump/consumedProperties=false +# Turn on dump of the realized node for each produced class +org.eclipse.qvtd.compiler/qvtp2qvts/dump/class2realizedNodes=false +# Turn on dump of the domain usage for each input model +org.eclipse.qvtd.compiler/qvtp2qvts/dump/inputModel2domainUsage=false +# Turn on dump of the possible containing properties for each class +org.eclipse.qvtd.compiler/qvtp2qvts/dump/property2consumingClass=false # Turn on tracing of the region depth computation org.eclipse.qvtd.compiler/qvtp2qvts/regionDepth=false # Turn on tracing of the region connection locality computation diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/OperationRegion.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/OperationRegion.java index 1d86652ea..30c1db323 100644 --- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/OperationRegion.java +++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/OperationRegion.java @@ -36,7 +36,6 @@ import org.eclipse.qvtd.compiler.internal.scheduler.DependencyAnalyzer.Dependenc import org.eclipse.qvtd.compiler.internal.scheduler.DependencyAnalyzer.NavigationDependencyStep; import org.eclipse.qvtd.pivot.qvtbase.TypedModel; import org.eclipse.qvtd.pivot.qvtcorebase.analysis.DomainUsage; -import org.eclipse.qvtd.pivot.schedule.ClassDatum; import org.eclipse.qvtd.pivot.schedule.utilities.GraphStringBuilder; import com.google.common.collect.Iterables; @@ -90,7 +89,7 @@ public class OperationRegion extends AbstractMappingRegion DependencyStep classStep = steps.get(0); DomainUsage stepUsage = classStep.getUsage(); if (stepUsage.isEnforceable() && !stepUsage.isCheckable()) { - System.out.println("!checkable && enforceable: " + steps); +// System.out.println("!checkable && enforceable: " + steps); org.eclipse.ocl.pivot.Class stepType = steps.get(0).getElementalType(); TypedModel typedModel = stepUsage.getTypedModel(); assert typedModel != null; @@ -135,7 +134,7 @@ public class OperationRegion extends AbstractMappingRegion } } else { - System.out.println("checkable || !enforceable: " + steps); +// System.out.println("checkable || !enforceable: " + steps); } } } diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/ScheduledRegion.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/ScheduledRegion.java index 35b734ab6..b0b9e5e2e 100644 --- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/ScheduledRegion.java +++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/ScheduledRegion.java @@ -18,6 +18,8 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import java.util.function.BinaryOperator; +import java.util.stream.Stream; import org.eclipse.emf.ecore.EObject; import org.eclipse.jdt.annotation.NonNull; @@ -126,6 +128,10 @@ public class ScheduledRegion extends AbstractRegion } return true; } + + public static @NonNull BinaryOperator<@NonNull String> stringJoin(@NonNull String delimiter) { + return (a, b) -> String.valueOf(a) + delimiter + String.valueOf(b); + } private final @NonNull String name; protected final @NonNull CompleteModel completeModel; @@ -1048,6 +1054,7 @@ public class ScheduledRegion extends AbstractRegion addRegion(rootContainmentRegion); @SuppressWarnings("null")@NonNull Set<ClassDatumAnalysis> consumedClassDatumAnalyses = consumedClassDatumAnalysis2headNodes.keySet(); // FIXME all consumed classes for (@SuppressWarnings("null")@NonNull ClassDatumAnalysis consumedClassDatumAnalysis : consumedClassDatumAnalyses) { +// System.out.println("ScheduledRegion.createRootContainmentRegion: " + consumedClassDatumAnalysis); boolean canBeAtRoot = !consumedClassDatumAnalysis.getDomainUsage().isEnforceable(); if (consumedClassDatumAnalysis.getClassDatum().getType() instanceof DataType) { canBeAtRoot = false; @@ -1086,22 +1093,37 @@ public class ScheduledRegion extends AbstractRegion // Identify the input models. // computeInputModels(); + if (Scheduler.DUMP_INPUT_MODEL_TO_DOMAIN_USAGE.isActive()) { + Scheduler.DUMP_INPUT_MODEL_TO_DOMAIN_USAGE.println(dumpInputModels().reduce("", stringJoin("\n\t"))); + } // // Identify all the containment relationships in the input models. // computeContainedClassDatumAnalysis2compositeProperties(); + if (Scheduler.DUMP_CLASS_TO_CONTAINING_PROPERTIES.isActive()) { + Scheduler.DUMP_CLASS_TO_CONTAINING_PROPERTIES.println(dumpClass2ContainingProperties().reduce("", stringJoin("\n\t"))); + } // // Identify all classes that are produced by mappings. // computeProducedClassDatumAnalysis2realizedNodes(); + if (Scheduler.DUMP_CLASS_TO_REALIZED_NODES.isActive()) { + Scheduler.DUMP_CLASS_TO_REALIZED_NODES.println(dumpClass2ProducingNode().reduce("", stringJoin("\n\t"))); + } // // Identify all classes that are consumed as independent inputs of mappings. // computeConsumedConsumedClassDatumAnalysis2headNodes(); + if (Scheduler.DUMP_CLASS_TO_CONSUMING_NODES.isActive()) { + Scheduler.DUMP_CLASS_TO_CONSUMING_NODES.println(dumpClass2consumingNode().reduce("", stringJoin("\n\t"))); + } // // Identify all classes that are transitively consumed as containers of consumed classes. // computeConsumedCompositeProperty2introducedClassDatumAnalyses(); + if (Scheduler.DUMP_PROPERTY_TO_CONSUMING_CLASSES.isActive()) { + Scheduler.DUMP_PROPERTY_TO_CONSUMING_CLASSES.println(dumpClass2ConsumingProperty().reduce("", stringJoin("\n\t"))); + } // // Create containment regions to traverse all in-use compositions to introduce all consumed classes. // @@ -1404,6 +1426,63 @@ public class ScheduledRegion extends AbstractRegion } } */ + public Stream<String> dumpClass2consumingNode() { + Stream<String> entries = consumedClassDatumAnalysis2headNodes.keySet().stream().map( + k -> { + List<Node> list = consumedClassDatumAnalysis2headNodes.get(k); + return String.valueOf(k) + " : " + list.stream().map( + p -> p.getDisplayName() + ).sorted().reduce("", stringJoin("\n\t\t")); + } + ); + return entries.sorted(); + } + + public Stream<String> dumpClass2ConsumingProperty() { + Stream<String> entries = consumedCompositeProperty2introducedClassDatumAnalyses.keySet().stream().map( + k -> { + Set<ClassDatumAnalysis> set = consumedCompositeProperty2introducedClassDatumAnalyses.get(k); + return String.valueOf(k) + " : " + + set.stream().map( + p -> p.toString() + ).sorted().reduce("", stringJoin("\n\t\t")); + } + ); + return entries.sorted(); + } + + public Stream<String> dumpClass2ContainingProperties() { + Stream<String> entries = containedClassDatumAnalysis2compositeProperties.keySet().stream().map( + k -> { + Set<Property> set = containedClassDatumAnalysis2compositeProperties.get(k); + return String.valueOf(k) + " " + k.getClass().getSimpleName() + "@" + Integer.toHexString(System.identityHashCode(k)) + " : " + set.stream().map( + p -> String.valueOf(p)).sorted().reduce("", stringJoin("\n\t\t") + ); + } + ); + return entries.sorted(); + } + + public Stream<String> dumpClass2ProducingNode() { + Stream<String> entries = producedClassDatumAnalysis2realizedNodes.keySet().stream().map( + k -> { + List<Node> list = producedClassDatumAnalysis2realizedNodes.get(k); + return String.valueOf(k) + " : " + + list.stream().map( + p -> p.getDisplayName() + ).sorted().reduce("", stringJoin("\n\t\t") + ); + } + ); + return entries.sorted(); + } + + public Stream<String> dumpInputModels() { + Stream<String> entries = inputModels.keySet().stream().map( + k -> String.valueOf(k) + " : " + String.valueOf(inputModels.get(k))); + return entries.sorted(); + } + public @NonNull Iterable<Region> getCallableRegions() { List<Region> callableRegions = new ArrayList<Region>(); for (@SuppressWarnings("null")@NonNull Region region : getRegions()) { diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/Scheduler.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/Scheduler.java index fdfab726c..70610257b 100644 --- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/Scheduler.java +++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/Scheduler.java @@ -47,6 +47,11 @@ import org.eclipse.qvtd.pivot.schedule.utilities.DependencyUtil; public class Scheduler extends SchedulerConstants { public static final @NonNull TracingOption DEPENDENCY_ANALYSIS = new TracingOption(CompilerConstants.PLUGIN_ID, "qvtp2qvts/dependencyAnalysis"); + public static final @NonNull TracingOption DUMP_CLASS_TO_CONSUMING_NODES = new TracingOption(CompilerConstants.PLUGIN_ID, "qvtp2qvts/dump/class2consumingNodes"); + public static final @NonNull TracingOption DUMP_CLASS_TO_CONTAINING_PROPERTIES = new TracingOption(CompilerConstants.PLUGIN_ID, "qvtp2qvts/dump/class2containingProperty"); + public static final @NonNull TracingOption DUMP_CLASS_TO_REALIZED_NODES = new TracingOption(CompilerConstants.PLUGIN_ID, "qvtp2qvts/dump/class2realizedNodes"); + public static final @NonNull TracingOption DUMP_INPUT_MODEL_TO_DOMAIN_USAGE = new TracingOption(CompilerConstants.PLUGIN_ID, "qvtp2qvts/dump/inputModel2domainUsage"); + public static final @NonNull TracingOption DUMP_PROPERTY_TO_CONSUMING_CLASSES = new TracingOption(CompilerConstants.PLUGIN_ID, "qvtp2qvts/dump/property2consumingClass"); public static final @NonNull TracingOption EDGE_ORDER = new TracingOption(CompilerConstants.PLUGIN_ID, "qvtp2qvts/edgeOrder"); public static final @NonNull TracingOption REGION_DEPTH = new TracingOption(CompilerConstants.PLUGIN_ID, "qvtp2qvts/regionDepth"); public static final @NonNull TracingOption REGION_LOCALITY = new TracingOption(CompilerConstants.PLUGIN_ID, "qvtp2qvts/regionLocality"); diff --git a/tests/org.eclipse.qvtd.cs2as.compiler.tests/src/org/eclipse/qvtd/cs2as/compiler/tests/OCL2QVTiTestCases.java b/tests/org.eclipse.qvtd.cs2as.compiler.tests/src/org/eclipse/qvtd/cs2as/compiler/tests/OCL2QVTiTestCases.java index f6f3c109c..19cbbaea2 100644 --- a/tests/org.eclipse.qvtd.cs2as.compiler.tests/src/org/eclipse/qvtd/cs2as/compiler/tests/OCL2QVTiTestCases.java +++ b/tests/org.eclipse.qvtd.cs2as.compiler.tests/src/org/eclipse/qvtd/cs2as/compiler/tests/OCL2QVTiTestCases.java @@ -50,6 +50,7 @@ import org.eclipse.qvtd.compiler.internal.etl.EtlTask; import org.eclipse.qvtd.compiler.internal.etl.MtcBroker; import org.eclipse.qvtd.compiler.internal.etl.PivotModel; import org.eclipse.qvtd.compiler.internal.etl.QvtMtcExecutionException; +import org.eclipse.qvtd.compiler.internal.scheduler.Scheduler; import org.eclipse.qvtd.cs2as.compiler.CS2ASJavaCompilerParameters; import org.eclipse.qvtd.cs2as.compiler.internal.CS2ASJavaCompilerImpl; import org.eclipse.qvtd.cs2as.compiler.internal.CS2ASJavaCompilerParametersImpl; @@ -484,6 +485,11 @@ public class OCL2QVTiTestCases extends LoadTestCase { @Test public void testNewExample2_V2_CG() throws Exception { + Scheduler.DUMP_CLASS_TO_CONSUMING_NODES.setState(true); + Scheduler.DUMP_CLASS_TO_CONTAINING_PROPERTIES.setState(true); + Scheduler.DUMP_CLASS_TO_REALIZED_NODES.setState(true); + Scheduler.DUMP_INPUT_MODEL_TO_DOMAIN_USAGE.setState(true); + Scheduler.DUMP_PROPERTY_TO_CONSUMING_CLASSES.setState(true); // Scheduler.EDGE_ORDER.setState(true); // Scheduler.REGION_DEPTH.setState(true); // Scheduler.REGION_ORDER.setState(true); |