All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.uni.freiburg.iig.telematik.jagal.ts.util.TSMinimizer Maven / Gradle / Ivy

Go to download

JAGAL provides implementations for directed graphs (weighted and unweighted) and various types of transition systems as well as utils for graph traversal and modification.

The newest version!
package de.uni.freiburg.iig.telematik.jagal.ts.util;

import java.util.HashSet;

import de.uni.freiburg.iig.telematik.jagal.ts.MarkingStatePairContainer;
import de.uni.freiburg.iig.telematik.jagal.ts.StatePair;
import de.uni.freiburg.iig.telematik.jagal.ts.StatePairContainer;
import de.uni.freiburg.iig.telematik.jagal.ts.exception.StateNotFoundException;
import de.uni.freiburg.iig.telematik.jagal.ts.labeled.LabeledTransitionSystem;
import de.uni.freiburg.iig.telematik.jagal.ts.labeled.abstr.AbstractEvent;
import de.uni.freiburg.iig.telematik.jagal.ts.labeled.abstr.AbstractLTSState;
import de.uni.freiburg.iig.telematik.jagal.ts.labeled.abstr.AbstractLabeledTransitionRelation;
import de.uni.freiburg.iig.telematik.jagal.ts.labeled.abstr.AbstractLabeledTransitionSystem;
import de.uni.freiburg.iig.telematik.jagal.ts.labeled.exception.EventNotFoundException;

public class TSMinimizer {

        public static , R extends AbstractLabeledTransitionRelation, O> void minimize(AbstractLabeledTransitionSystem ts) {

                if (!ts.isDFA()) {
                        throw new IllegalArgumentException("This minimization only operates on DFNs");
                }
                MarkingStatePairContainer container = MarkingStatePairContainer.newInstance(StatePairContainer.getStatePairsFrom(ts.getStates()));
                for (StatePair statePair : container.getStatePairs()) {
                        if ((ts.isEndState(statePair.state1.getName()) && !ts.isEndState(statePair.state2.getName()))
                                || (!ts.isEndState(statePair.state1.getName()) && ts.isEndState(statePair.state2.getName()))) {
                                container.markPair(StatePair.createStatePair(statePair.state1, statePair.state2));
                        }
                }

                boolean newMarkedPairs;
                do {
                        newMarkedPairs = false;
                        for (StatePair statePair : new HashSet<>(container.getUnmarkedStatePairs())) {
                                for (E event : ts.getEvents()) {
                                        try {
                                                if ((!ts.getTargetsFor(statePair.state1.getName(), event.getName()).isEmpty() && !ts.getTargetsFor(statePair.state2.getName(), event.getName()).isEmpty())
                                                        && (container.isMarked(ts.getTargetsFor(statePair.state1.getName(), event.getName()).get(0), ts.getTargetsFor(statePair.state2.getName(), event.getName()).get(0)))) {
                                                        container.markPair(statePair);
                                                        newMarkedPairs = true;
                                                        break;
                                                }
                                        } catch (StateNotFoundException | EventNotFoundException e) {
                                                throw new RuntimeException(e);
                                        }
                                }
                        }
                } while (newMarkedPairs);

	//TODO: Merging
//		System.out.println("pairs: "+ container.getUnmarkedStatePairs());
        }

        public static void main(String[] args) throws Exception {
                LabeledTransitionSystem ts = new LabeledTransitionSystem();
                ts.addState("z0");
                ts.addState("z1");
                ts.addState("z2");
                ts.addState("z3");
                ts.addState("z4");
                ts.addStartState("z0");
                ts.addEndState("z4");
                ts.addEvent("e0");
                ts.addEvent("e1");
                ts.addRelation("z0", "z1", "e0");
                ts.addRelation("z0", "z2", "e1");
                ts.addRelation("z1", "z4", "e0");
                ts.addRelation("z1", "z2", "e1");
                ts.addRelation("z2", "z2", "e1");
                ts.addRelation("z2", "z3", "e0");
                ts.addRelation("z3", "z0", "e1");
                ts.addRelation("z3", "z4", "e0");
                ts.addRelation("z4", "z4", "e0");
                ts.addRelation("z4", "z4", "e1");
                System.out.println(ts);
                TSMinimizer.minimize(ts);
//		MarkingStatePairContainer cont = new MarkingStatePairContainer();
//		System.out.println(cont.getUnmarkedStatePairs());
        }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy