Skip to content

Commit

Permalink
GenerationPlan: add tests as regular JUnit tests
Browse files Browse the repository at this point in the history
  • Loading branch information
artem-tikhomirov committed Apr 23, 2014
1 parent 2bce032 commit 2b306fc
Show file tree
Hide file tree
Showing 6 changed files with 526 additions and 176 deletions.
30 changes: 30 additions & 0 deletions .idea/runConfigurations/GenerationPlanTest.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,16 @@ public List<List<TemplateMappingConfiguration>> createMappingSets() {
final PartitioningSolver partitioningSolver = new PartitioningSolver(myPriorityMap, myPriorityGraph, myCoherentMappings);
// partitioningSolver.solveNew();
// return partitioningSolver.solve();
return partitioningSolver.solveNew();
final List<GenerationPhase> generationPhases = partitioningSolver.solveNew();
return phaseAsPlainList(generationPhases);
}

static List<List<TemplateMappingConfiguration>> phaseAsPlainList(List<GenerationPhase> phases) {
List<List<TemplateMappingConfiguration>> rv = new ArrayList<List<TemplateMappingConfiguration>>();
for (GenerationPhase gp : phases) {
rv.add(gp.getAllElements());
}
return rv;
}

private void loadRules() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
/*
* Copyright 2003-2014 JetBrains s.r.o.
*
* 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 jetbrains.mps.generator.impl.plan;

import jetbrains.mps.generator.runtime.TemplateMappingConfiguration;
import jetbrains.mps.generator.runtime.TemplateModule;
import org.jetbrains.annotations.NotNull;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;

/**
* Describes set of mapping configurations to apply at consecutive steps. The phase may constitute one or more generation steps.
* Configurations within single phase have no strict dependency between each other (other than 'strictly together').
* @author Artem Tikhomirov
*/
class GenerationPhase {
private final Collection<Group> myPhaseElements;

GenerationPhase(@NotNull Collection<Group> groups) {
myPhaseElements = groups;
}

public List<TemplateMappingConfiguration> getAllElements() {
return asList(myPhaseElements);
}


public List<Group> getGroups() {
return new ArrayList<Group>(myPhaseElements);
}


void groupByGenerator() {
HashMap<TemplateModule, Group> groupByModule = new HashMap<TemplateModule, Group>();
HashMap<Group, Set<TemplateModule>> groupsWithFewModules = new HashMap<Group, Set<TemplateModule>>();
ArrayList<Group> step = new ArrayList<Group>();
for (Group g : myPhaseElements) {
System.out.println(g);
final Set<TemplateModule> involvedGenerators = getInvolvedGenerators(g);
if (involvedGenerators.size() == 1) {
final TemplateModule generator = involvedGenerators.iterator().next();
Group sameModuleGroup = groupByModule.get(generator);
groupByModule.put(generator, sameModuleGroup == null ? g : sameModuleGroup.union(g));
} else {
groupsWithFewModules.put(g, involvedGenerators);
}
}
System.out.println();
// add groups with single generator to a group with MC from few generators,
// so that g1 (GenA, GenB, GenC) includes g2(GenB), iow no distinct g1 and g2.
for (Entry<Group, Set<TemplateModule>> e : groupsWithFewModules.entrySet()) {
Group compositeGroup = e.getKey();
for (TemplateModule tm : e.getValue()) {
if (groupByModule.containsKey(tm)) {
compositeGroup = compositeGroup.union(groupByModule.remove(tm));
}
}
step.add(compositeGroup);
}
step.addAll(groupByModule.values()); // add those left not in use by any composite group
}

private static List<TemplateMappingConfiguration> asList(Collection<Group> groups) {
ArrayList<TemplateMappingConfiguration> stepAsList = new ArrayList<TemplateMappingConfiguration>();
for (Group g : groups) {
stepAsList.addAll(g.getElements());
}
PartitioningSolver.sort(stepAsList);
return stepAsList;
}

private static Set<TemplateModule> getInvolvedGenerators(Group mappings) {
HashSet<TemplateModule> rv = new HashSet<TemplateModule>();
for (TemplateMappingConfiguration tmc : mappings.getElements()) {
rv.add(tmc.getModel().getModule());
}
return rv;
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2003-2013 JetBrains s.r.o.
* Copyright 2003-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand All @@ -15,35 +15,19 @@
*/
package jetbrains.mps.generator.impl.plan;

import jetbrains.mps.generator.impl.RuleUtil;
import jetbrains.mps.generator.impl.interpreted.TemplateMappingConfigurationInterpreted;
import jetbrains.mps.generator.impl.plan.GenerationPartitioner.CoherentSetData;
import jetbrains.mps.generator.impl.plan.GenerationPartitioner.PriorityData;
import jetbrains.mps.generator.runtime.TemplateMappingConfiguration;
import jetbrains.mps.generator.runtime.TemplateModule;
import jetbrains.mps.project.structure.modules.mappingpriorities.MappingPriorityRule;
import jetbrains.mps.project.structure.modules.mappingpriorities.RuleType;
import jetbrains.mps.smodel.SModel;
import jetbrains.mps.smodel.SModelId;
import jetbrains.mps.smodel.SModelReference;
import jetbrains.mps.smodel.SNodeAccessUtilImpl;
import jetbrains.mps.smodel.SNodePointer;
import jetbrains.mps.util.Pair;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.mps.openapi.model.SNode;
import org.jetbrains.mps.openapi.model.SNodeAccessUtil;
import org.jetbrains.mps.openapi.model.SNodeReference;

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

/**
* evgeny, 3/10/11
Expand All @@ -58,132 +42,6 @@ public class PartitioningSolver {
*/
private final List<CoherentSetData> myCoherentMappings;

public static void main(String[] args) {
SNodeAccessUtil.setInstance(new SNodeAccessUtilImpl());
PriorityConflicts pc = new PriorityConflicts();
PriorityMap pmap = new PriorityMap(pc);
PriorityGraph pgraph = new PriorityGraph(pc);
ArrayList<CoherentSetData> csd = new ArrayList<CoherentSetData>();
prepareTest2(pmap, pgraph, csd);
final PartitioningSolver partitioningSolver = new PartitioningSolver(pmap, pgraph, csd);
System.out.println("New");
print(partitioningSolver.solveNew());
System.out.println("Legacy");
print(partitioningSolver.solve());
}

private static void prepareTest0(PriorityMap pmap, PriorityGraph pgraph) {
TemplateMappingConfiguration tmcA = new MockMapConfig("A");
TemplateMappingConfiguration tmcB = new MockMapConfig("B");
TemplateMappingConfiguration tmcC = new MockMapConfig("C");
final List<TemplateMappingConfiguration> allConfigs = Arrays.asList(tmcA, tmcB, tmcC);
pmap.prepare(allConfigs);
pmap.updateLock(tmcB, tmcA, new PriorityData(false, Collections.<MappingPriorityRule>emptySet()));
pmap.updateLock(tmcC, tmcB, new PriorityData(true, Collections.<MappingPriorityRule>emptySet()));
MappingPriorityRule strictRule = new MappingPriorityRule();
strictRule.setType(RuleType.STRICTLY_AFTER);
MappingPriorityRule weakRule = new MappingPriorityRule();
weakRule.setType(RuleType.AFTER_OR_TOGETHER);
pgraph.addEdge(tmcB, Collections.singleton(tmcA), weakRule);
pgraph.addEdge(tmcC, Collections.singleton(tmcB), strictRule);
pgraph.finalizeEdges(allConfigs);
}

private static void prepareTest1(PriorityMap pmap, PriorityGraph pgraph) {
TemplateMappingConfiguration tmcA = new MockMapConfig("A");
TemplateMappingConfiguration tmcB = new MockMapConfig("B");
TemplateMappingConfiguration tmcC = new MockMapConfig("C");
TemplateMappingConfiguration tmcD = new MockMapConfig("D");
TemplateMappingConfiguration tmcX = new MockMapConfig("X");
TemplateMappingConfiguration tmcY = new MockMapConfig("Y");
final List<TemplateMappingConfiguration> allConfigs = Arrays.asList(tmcA, tmcB, tmcC, tmcD, tmcX, tmcY);
pmap.prepare(allConfigs);
pmap.updateLock(tmcB, tmcA, new PriorityData(false, Collections.<MappingPriorityRule>emptySet()));
pmap.updateLock(tmcC, tmcB, new PriorityData(true, Collections.<MappingPriorityRule>emptySet()));
pmap.updateLock(tmcD, tmcB, new PriorityData(false, Collections.<MappingPriorityRule>emptySet()));
pmap.updateLock(tmcA, tmcX, new PriorityData(true, Collections.<MappingPriorityRule>emptySet()));
pmap.updateLock(tmcA, tmcY, new PriorityData(false, Collections.<MappingPriorityRule>emptySet()));
//
MappingPriorityRule strictRule = getStrictRule();
MappingPriorityRule weakRule = getWeakRule();
pgraph.addEdge(tmcB, Collections.singleton(tmcA), weakRule);
pgraph.addEdge(tmcC, Collections.singleton(tmcB), strictRule);
pgraph.addEdge(tmcD, Collections.singleton(tmcB), weakRule);
pgraph.addEdge(tmcA, Collections.singleton(tmcX), strictRule);
pgraph.addEdge(tmcA, Collections.singleton(tmcY), weakRule);
pgraph.finalizeEdges(allConfigs);
}

// legacy: E, B, C, A, D
// new: E, B, C, C, A, D,
private static void prepareTest2(PriorityMap pmap, PriorityGraph pgraph, List<CoherentSetData> d) {
TemplateMappingConfiguration tmcA = new MockMapConfig("A");
TemplateMappingConfiguration tmcB = new MockMapConfig("B");
TemplateMappingConfiguration tmcC = new MockMapConfig("C");
TemplateMappingConfiguration tmcD = new MockMapConfig("D");
TemplateMappingConfiguration tmcE = new MockMapConfig("E");
TemplateMappingConfiguration tmcX = new MockMapConfig("X");
final List<TemplateMappingConfiguration> allConfigs = Arrays.asList(tmcA, tmcB, tmcC, tmcD, tmcE, tmcX);
pmap.prepare(allConfigs);
pmap.updateLock(tmcX, tmcB, new PriorityData(true, Collections.<MappingPriorityRule>emptySet()));
pgraph.addEdge(tmcX, Collections.singleton(tmcB), getStrictRule());
pgraph.finalizeEdges(allConfigs);
//
d.add(new CoherentSetData(new HashSet<TemplateMappingConfiguration>(Arrays.asList(tmcA, tmcB)), getWeakRule()));
d.add(new CoherentSetData(new HashSet<TemplateMappingConfiguration>(Arrays.asList(tmcB, tmcC)), getWeakRule()));
d.add(new CoherentSetData(new HashSet<TemplateMappingConfiguration>(Arrays.asList(tmcC, tmcD)), getWeakRule()));
d.add(new CoherentSetData(new HashSet<TemplateMappingConfiguration>(Arrays.asList(tmcE, tmcD)), getWeakRule()));
}

private static MappingPriorityRule getWeakRule() {
MappingPriorityRule weakRule = new MappingPriorityRule();
weakRule.setType(RuleType.AFTER_OR_TOGETHER);
return weakRule;
}
private static MappingPriorityRule getStrictRule() {
MappingPriorityRule strictRule = new MappingPriorityRule();
strictRule.setType(RuleType.STRICTLY_AFTER);
return strictRule;
}

private static void print(List<List<TemplateMappingConfiguration>> r) {
for (List<TemplateMappingConfiguration> steps : r) {
System.out.print("Step: ");
for (TemplateMappingConfiguration tmc : steps) {
System.out.print(tmc.getName());
System.out.print(", ");
}
System.out.println();
}
}

private static class MockMapConfig extends TemplateMappingConfigurationInterpreted {
private final SNodeReference myNode;
private final String myName;

public MockMapConfig(String name) {
super(null, createMapConfigNode(name));
myName = name;
myNode = new SNodePointer(new SModelReference(null, SModelId.generate(), "MockModel"), SModel.generateUniqueId());
}

@Override
public String getName() {
return myName;
}

@Override
public SNodeReference getMappingNode() {
return myNode;
}

private static SNode createMapConfigNode(String name) {
SNode n = new jetbrains.mps.smodel.SNode(RuleUtil.concept_MappingConfiguration);
n.setProperty("name", name);
return n;
}
}

public PartitioningSolver(@NotNull PriorityMap priorityMap, @NotNull PriorityGraph graph, @NotNull List<CoherentSetData> coherentMappings) {
myPriorityMap = priorityMap;
myPriorityGraph = graph;
Expand Down Expand Up @@ -258,18 +116,18 @@ List<List<TemplateMappingConfiguration>> solve() {
return mappingSets;
}

List<List<TemplateMappingConfiguration>> solveNew() {
List<GenerationPhase> solveNew() {
myPriorityGraph.checkSelfLocking();

myPriorityGraph.replaceWeakEdgesWithStrict();

List<Group> coherentMappings = new ArrayList<Group>();
for (CoherentSetData d : myCoherentMappings) {
coherentMappings.add(new Group(d.myMappings, d.myCauseRules));
}
coherentMappings = PriorityMapUtil.joinSameStepMappings(coherentMappings);
myPriorityGraph.updateWithCoherent(coherentMappings);

myPriorityGraph.replaceWeakEdgesWithStrict();

boolean topPriorityGroup = false;
ArrayDeque<Collection<Group>> stack = new ArrayDeque<Collection<Group>>();
while (!myPriorityGraph.isEmpty()) {
Expand All @@ -291,24 +149,9 @@ List<List<TemplateMappingConfiguration>> solveNew() {
myPriorityGraph.dropEdgesOf(step);
}
}
List<List<TemplateMappingConfiguration>> rv = new ArrayList<List<TemplateMappingConfiguration>>();
ArrayList<GenerationPhase> rv = new ArrayList<GenerationPhase>(stack.size());
while (!stack.isEmpty()) {
ArrayList<TemplateMappingConfiguration> step = new ArrayList<TemplateMappingConfiguration>();
for (Group g : stack.pop()) {
// System.out.println("Group");
for (TemplateMappingConfiguration tmc : g.getElements()) {
step.add(tmc);
// System.out.printf("\t%s.%s\n", tmc.getModel().getLongName(), tmc.getName());
}
}
sort(step);
rv.add(step);
//
// for (Pair<String, TemplateMappingConfiguration> pair : GenerationPartitioningUtil.toStrings(step)) {
// System.out.println(pair.o1);
// }
//
// System.out.println();
rv.add(new GenerationPhase(stack.pop()));
}
return rv;
}
Expand Down Expand Up @@ -337,7 +180,7 @@ private List<List<TemplateMappingConfiguration>> createMappingSets() {
return mappingSets;
}

private static void sort(List<TemplateMappingConfiguration> mappingSet) {
static void sort(List<TemplateMappingConfiguration> mappingSet) {
Collections.sort(mappingSet, new Comparator<TemplateMappingConfiguration>() {
@Override
public int compare(TemplateMappingConfiguration o1, TemplateMappingConfiguration o2) {
Expand All @@ -358,12 +201,4 @@ private List<TemplateMappingConfiguration> createMappingSet(boolean topPriorityG
myPriorityMap.removeKeys(mappingSet);
return mappingSet;
}

private Set<TemplateModule> getInvolvedGenerators(List<TemplateMappingConfiguration> mappingSet) {
HashSet<TemplateModule> rv = new HashSet<TemplateModule>();
for (TemplateMappingConfiguration tmc : mappingSet) {
rv.add(tmc.getModel().getModule());
}
return rv;
}
}
Loading

0 comments on commit 2b306fc

Please sign in to comment.