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

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 = new MarkingStatePairContainer<>(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) {
						e.printStackTrace();
					}
				}
			}
		} 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