workcraft/workcraft

View on GitHub
workcraft/SonPlugin/src/org/workcraft/plugins/son/algorithm/SONAlg.java

Summary

Maintainability
B
5 hrs
Test Coverage
package org.workcraft.plugins.son.algorithm;

import java.util.ArrayList;
import java.util.Collection;

import org.workcraft.plugins.son.ONGroup;
import org.workcraft.plugins.son.SON;
import org.workcraft.plugins.son.elements.Condition;
import org.workcraft.plugins.son.elements.PlaceNode;

public class SONAlg extends RelationAlgorithm {

    private final BSONAlg bsonAlg;
    private final Collection<ONGroup> upperGroups;
    private final Collection<ONGroup> lowerGroups;

    public SONAlg(SON net) {
        super(net);
        bsonAlg = new BSONAlg(net);

        upperGroups = bsonAlg.getUpperGroups(net.getGroups());
        lowerGroups = bsonAlg.getLowerGroups(net.getGroups());
    }

    //get SON initial marking
    public Collection<PlaceNode> getSONInitial() {
        Collection<PlaceNode> result = new ArrayList<>();

        for (ONGroup group : net.getGroups()) {
            if (upperGroups.contains(group)) {
                for (Condition c : getONInitial(group)) {
                    result.add(c);
                }
            } else if (lowerGroups.contains(group)) {
                //an initial state of a lower group is the initial state of SON
                //if all of its upper conditions are the initial states.
                for (Condition c : getONInitial(group)) {
                    boolean isInitial = true;
                    Collection<Condition> set = bsonAlg.getUpperConditions(c);
                    for (Condition c2 : set) {
                        if (!isInitial(c2)) {
                            ONGroup group2 = net.getGroup(c2);
                            if (!set.containsAll(getONInitial(group2))) {
                                isInitial = false;
                            }
                        }
                    }
                    if (isInitial) result.add(c);
                }
            } else {
                for (Condition c : getONInitial(group)) {
                    result.add(c);
                }
            }
        }
        return result;
    }

    //get SON final marking
    public Collection<PlaceNode> getSONFinal() {
        Collection<PlaceNode> result = new ArrayList<>();

        for (ONGroup group : net.getGroups()) {
            if (upperGroups.contains(group)) {
                for (Condition c : getONFinal(group)) {
                    result.add(c);
                }
            } else if (lowerGroups.contains(group)) {
                for (Condition c : getONFinal(group)) {
                    boolean isFinal = true;
                    Collection<Condition> set = bsonAlg.getUpperConditions(c);
                    for (Condition c2 : set) {
                        if (!isInitial(c2)) {
                            ONGroup group2 = net.getGroup(c2);
                            if (!set.containsAll(getONFinal(group2))) {
                                isFinal = false;
                            }
                        }
                    }
                    if (isFinal) result.add(c);
                }
            } else {
                for (Condition c : getONFinal(group)) {
                    result.add(c);
                }
            }
        }
        return result;
    }
}