Skip to content

Commit

Permalink
Merge 1532dad into be6c7ed
Browse files Browse the repository at this point in the history
  • Loading branch information
danilovesky committed Aug 3, 2023
2 parents be6c7ed + 1532dad commit 4bc9b3f
Show file tree
Hide file tree
Showing 16 changed files with 224 additions and 213 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public class CfltPlugin implements Plugin {

@Override
public String getDescription() {
return "Cflt plugin";
return "Control Flow Logic translator plugin";
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,17 @@
import org.workcraft.utils.WorkspaceUtils;
import org.workcraft.workspace.WorkspaceEntry;

import java.util.function.BiConsumer;

public class TranslateProFloExpressionCommand implements Command, MenuOrdering {

private static final String PRESET_KEY = "proflo-expressions.xml";
private static final ExpressionDataSerialiser DATA_SERIALISER = new ExpressionDataSerialiser();

private static ExpressionParameters preservedData = null;

public static BiConsumer<WorkspaceEntry, String> externalTranslator = null;

@Override
public final String getSection() {
return AbstractConversionCommand.SECTION_TITLE;
Expand Down Expand Up @@ -52,29 +56,43 @@ public boolean isApplicableTo(WorkspaceEntry we) {
public void run(WorkspaceEntry we) {
Framework framework = Framework.getInstance();
MainWindow mainWindow = framework.getMainWindow();
ExpressionUtils.we = we;

PresetManager<ExpressionParameters> presetManager
= new PresetManager<>(we, PRESET_KEY, DATA_SERIALISER, preservedData);

ExpressionDialog dialog = new ExpressionDialog(mainWindow, presetManager);
ExpressionDialog dialog = new ExpressionDialog(mainWindow, presetManager, externalTranslator != null);

if (dialog.reveal()) {
preservedData = dialog.getPresetData();
String expression = preservedData.getExpression();
ExpressionParameters.Mode mode = preservedData.getMode();
we.captureMemento();
if (WorkspaceUtils.isApplicable(we, VisualPetri.class)) {
VisualPetri petri = WorkspaceUtils.getAs(we, VisualPetri.class);
if (!ExpressionUtils.insert(petri, expression, mode)) {
we.cancelMemento();
}
process(we, preservedData);
}
}

private static void process(WorkspaceEntry we, ExpressionParameters data) {
ExpressionParameters.Mode mode = data.getMode();
String expression = data.getExpression();
if (mode != null) {
if (mode == ExpressionParameters.Mode.EXTERNAL) {
externalTranslator.accept(we, expression);
} else {
insert(we, expression, mode);
}
if (WorkspaceUtils.isApplicable(we, VisualStg.class)) {
VisualStg stg = WorkspaceUtils.getAs(we, VisualStg.class);
if (!ExpressionUtils.insert(stg, expression, mode)) {
we.cancelMemento();
}
}
}

private static void insert(WorkspaceEntry we, String expression, ExpressionParameters.Mode mode) {
we.captureMemento();
ExpressionUtils.we = we;
if (WorkspaceUtils.isApplicable(we, VisualPetri.class)) {
VisualPetri petri = WorkspaceUtils.getAs(we, VisualPetri.class);
if (!ExpressionUtils.insert(petri, expression, mode)) {
we.cancelMemento();
}
}
if (WorkspaceUtils.isApplicable(we, VisualStg.class)) {
VisualStg stg = WorkspaceUtils.getAs(we, VisualStg.class);
if (!ExpressionUtils.insert(stg, expression, mode)) {
we.cancelMemento();
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public static ArrayList<ArrayList<String>> getEdgeCliqueCover(Graph initG, Array
}
//printSolution(allMaxCliques);
AdvancedGraph g = null;
if (initG.getEdges().size() != 0) {
if (!initG.getEdges().isEmpty()) {
// Max number of cliques to be used in the final ecc (i.e. the depth of the tree to be traversed)
int k = 0;
while (ecc.isEmpty()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,9 +64,9 @@ public static ArrayList<ArrayList<String>> getEdgeCliqueCover(Graph g, ArrayList
while (!uncoveredVertices.isEmpty()) {
String i;
if (max) {
i = EccUtils.argmax(uncoveredDegree, uncoveredVertices);
i = EccUtils.argMax(uncoveredDegree, uncoveredVertices);
} else {
i = EccUtils.argmin(uncoveredDegree, uncoveredVertices);
i = EccUtils.argMin(uncoveredDegree, uncoveredVertices);
}

// While there are still uncovered edges adjacent to the vertex
Expand All @@ -87,7 +87,7 @@ public static ArrayList<ArrayList<String>> getEdgeCliqueCover(Graph g, ArrayList
localUncoveredDegree.put(j, 1 - isCovered.get(i + j));
}

String u = EccUtils.argmax(localUncoveredDegree, localNeighbourhoodOfi);
String u = EccUtils.argMax(localUncoveredDegree, localNeighbourhoodOfi);
while (localUncoveredDegree.get(u) > 0) {
boolean isOptional = true;
for (String j : finalCliques.get(cliqueNumber)) {
Expand Down Expand Up @@ -126,7 +126,7 @@ public static ArrayList<ArrayList<String>> getEdgeCliqueCover(Graph g, ArrayList
localUncoveredDegree.replace(j, temp + 1);
}
}
u = EccUtils.argmax(localUncoveredDegree, localNeighbourhoodOfi);
u = EccUtils.argMax(localUncoveredDegree, localNeighbourhoodOfi);
if (localNeighbourhoodOfi.isEmpty()) { break; }
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ public static ArrayList<ArrayList<String>> getEdgeCliqueCover(Graph g, ArrayList
localUncoveredDegree.put(j, 1 - isCovered.get(i + j));
}

String u = EccUtils.argmax(localUncoveredDegree, localNeighbourhoodOfi);
String u = EccUtils.argMax(localUncoveredDegree, localNeighbourhoodOfi);
while (localUncoveredDegree.get(u) > 0) {
boolean isOptional = true;
for (String j : finalCliques.get(cliqueNumber)) {
Expand Down Expand Up @@ -115,7 +115,7 @@ public static ArrayList<ArrayList<String>> getEdgeCliqueCover(Graph g, ArrayList
localUncoveredDegree.replace(j, temp + 1);
}
}
u = EccUtils.argmax(localUncoveredDegree, localNeighbourhoodOfi);
u = EccUtils.argMax(localUncoveredDegree, localNeighbourhoodOfi);
if (localNeighbourhoodOfi.isEmpty()) { break; }
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,14 @@ public class ExpressionDialog extends PresetDialog<ExpressionParameters> {
private JComboBox<ExpressionParameters.Mode> modeCombo;
private CodePanel codePanel;

public ExpressionDialog(Window owner, PresetManager presetManager) {
public ExpressionDialog(Window owner, PresetManager presetManager, boolean addExternalMode) {
super(owner, "ProFlo translator", presetManager);
presetPanel.selectFirst();

// Preset panel is set here, as it is created in overloaded createPresetPanel called from super constructor
if (addExternalMode) {
modeCombo.insertItemAt(ExpressionParameters.Mode.EXTERNAL, 0);
}
presetPanel.selectFirst();
try {
URI uri = new URI("https://workcraft.org/help/control_flow_expressions/start");
addHelpButton(uri);
Expand Down Expand Up @@ -77,7 +81,7 @@ private PresetManagerPanel<ExpressionParameters> createPresetPanel() {
addExample(presetManager, "Example with all operators",
"((i1|i2)#i3);((o1|o2)#(o3|o4)#(o5|o6|o7;o8));end");

DataMapper<ExpressionParameters> guiMapper = new DataMapper<ExpressionParameters>() {
DataMapper<ExpressionParameters> guiMapper = new DataMapper<>() {
@Override
public void applyDataToControls(ExpressionParameters data) {
modeCombo.setSelectedItem(data.getMode());
Expand All @@ -95,7 +99,7 @@ public ExpressionParameters getDataFromControls() {

private void addExample(PresetManager<ExpressionParameters> presetManager, String title, String expression) {
ExpressionParameters parameters = new ExpressionParameters(title,
ExpressionParameters.Mode.FAST_MIN, expression);
ExpressionParameters.Mode.EXTERNAL, expression);

presetManager.addExamplePreset(title, parameters);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
public class ExpressionParameters {

public enum Mode {
EXTERNAL("External ProFlo translator"),
FAST_MAX("Maximum heuristic"),
FAST_MIN("Minimum heuristic"),
FAST_SEQ("Sequence heuristic"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import org.workcraft.plugins.cflt.presets.ExpressionParameters.Mode;
import org.workcraft.plugins.cflt.utils.GraphUtils;

public class CotreeTool {
public final class CotreeTool {

public static ArrayList<Node> nodes;
public static String singleTransition;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,12 @@

public class PetriDrawingTool {

HashMap<String, VisualTransition> vTransitionMap = new HashMap<>();
private final HashMap<String, VisualTransition> transitionMap = new HashMap<>();

public void drawPetri(Graph inputG, Graph outputG, boolean isSequence, boolean isRoot, Mode mode) {
String eccOption = mode.toString();
VisualPetri vPetri = WorkspaceUtils.getAs(ExpressionUtils.we, VisualPetri.class);
VisualPetri petri = WorkspaceUtils.getAs(ExpressionUtils.we, VisualPetri.class);

ArrayList<ArrayList<String>> edgeCliqueCover = EccUtils.getEcc(isSequence, eccOption, inputG, outputG);
ArrayList<ArrayList<String>> edgeCliqueCover = EccUtils.getEcc(isSequence, mode, inputG, outputG);
HashSet<String> inputVertices = new HashSet<>();

if (!isSequence) {
Expand All @@ -35,30 +34,30 @@ public void drawPetri(Graph inputG, Graph outputG, boolean isSequence, boolean i
// Dealing with isolated vertices
if (inputG.getIsolatedVertices() != null) {
for (String vertex : inputG.getIsolatedVertices()) {
if (!vTransitionMap.containsKey(vertex) && !isSequence) {
VisualPlace vPlace = vPetri.createPlace(null, null);
vPlace.getReferencedComponent().setTokens(1);
vPlace.setNamePositioning(Positioning.LEFT);

VisualTransition newVtransition = vPetri.createTransition(null, null);
vTransitionMap.put(vertex, newVtransition);
newVtransition.setLabel(ExpressionUtils.labelNameMap.get(vertex));
newVtransition.setLabelPositioning(Positioning.BOTTOM);
newVtransition.setNamePositioning(Positioning.LEFT);
if (!transitionMap.containsKey(vertex) && !isSequence) {
VisualPlace place = petri.createPlace(null, null);
place.getReferencedComponent().setTokens(1);
place.setNamePositioning(Positioning.LEFT);

VisualTransition newTransition = petri.createTransition(null, null);
transitionMap.put(vertex, newTransition);
newTransition.setLabel(ExpressionUtils.labelNameMap.get(vertex));
newTransition.setLabelPositioning(Positioning.BOTTOM);
newTransition.setNamePositioning(Positioning.LEFT);
try {
vPetri.connect(vPlace, newVtransition);
petri.connect(place, newTransition);
} catch (InvalidConnectionException e) {
e.printStackTrace();
}

} else if (isRoot) {
VisualPlace vPlace = vPetri.createPlace(null, null);
VisualTransition vTransition = vTransitionMap.get(vertex);
vTransitionMap.put(vertex, vTransition);
vPlace.getReferencedComponent().setTokens(1);
VisualPlace place = petri.createPlace(null, null);
VisualTransition transition = transitionMap.get(vertex);
transitionMap.put(vertex, transition);
place.getReferencedComponent().setTokens(1);

try {
vPetri.connect(vPlace, vTransition);
petri.connect(place, transition);
} catch (InvalidConnectionException ignored) {
}
}
Expand All @@ -69,8 +68,8 @@ public void drawPetri(Graph inputG, Graph outputG, boolean isSequence, boolean i
// If the clique is not empty
if ((clique != null) && !clique.isEmpty()) {
// Get vertices of a single clique from it's edges
VisualPlace vPlace = vPetri.createPlace(null, null);
vPlace.setNamePositioning(Positioning.LEFT);
VisualPlace place = petri.createPlace(null, null);
place.setNamePositioning(Positioning.LEFT);
boolean connectionsOnlyFromPlaceToTransitions = true;

for (String v : clique) {
Expand All @@ -84,54 +83,54 @@ public void drawPetri(Graph inputG, Graph outputG, boolean isSequence, boolean i
vertex = v;
}

VisualTransition newVtransition;
if (!vTransitionMap.containsKey(vertex)) {
newVtransition = vPetri.createTransition(null, null);
vTransitionMap.put(vertex, newVtransition);
VisualTransition newTransition;
if (!transitionMap.containsKey(vertex)) {
newTransition = petri.createTransition(null, null);
transitionMap.put(vertex, newTransition);

newVtransition.setLabel(ExpressionUtils.labelNameMap.get(vertex));
newVtransition.setLabelPositioning(Positioning.BOTTOM);
newVtransition.setNamePositioning(Positioning.LEFT);
newTransition.setLabel(ExpressionUtils.labelNameMap.get(vertex));
newTransition.setLabelPositioning(Positioning.BOTTOM);
newTransition.setNamePositioning(Positioning.LEFT);

} else {
newVtransition = vTransitionMap.get(vertex);
newTransition = transitionMap.get(vertex);
}
try {
if (inputVertices.contains(vertex) || isClone) {

vPetri.connect(newVtransition, vPlace);
petri.connect(newTransition, place);
connectionsOnlyFromPlaceToTransitions = false;
if (isRoot) {
vPlace.getReferencedComponent().setTokens(1);
place.getReferencedComponent().setTokens(1);
}
} else {
vPetri.connect(vPlace, newVtransition);
petri.connect(place, newTransition);
}
} catch (InvalidConnectionException ignored) {
}
}
if (connectionsOnlyFromPlaceToTransitions) {
vPlace.getReferencedComponent().setTokens(1);
place.getReferencedComponent().setTokens(1);
}
}
}

}
public void drawSingleTransition(String name) {
VisualPetri vPetri = WorkspaceUtils.getAs(ExpressionUtils.we, VisualPetri.class);
VisualPetri petri = WorkspaceUtils.getAs(ExpressionUtils.we, VisualPetri.class);

VisualPlace vPlace = vPetri.createPlace(null, null);
vPlace.setNamePositioning(Positioning.LEFT);
vPlace.getReferencedComponent().setTokens(1);
VisualPlace place = petri.createPlace(null, null);
place.setNamePositioning(Positioning.LEFT);
place.getReferencedComponent().setTokens(1);

VisualTransition newVtransition = vPetri.createTransition(null, null);
VisualTransition newTransition = petri.createTransition(null, null);

newVtransition.setLabel(name);
newVtransition.setLabelPositioning(Positioning.BOTTOM);
newVtransition.setNamePositioning(Positioning.LEFT);
newTransition.setLabel(name);
newTransition.setLabelPositioning(Positioning.BOTTOM);
newTransition.setNamePositioning(Positioning.LEFT);

try {
vPetri.connect(vPlace, newVtransition);
petri.connect(place, newTransition);
} catch (InvalidConnectionException ignored) {
}
}
Expand Down

0 comments on commit 4bc9b3f

Please sign in to comment.