package hdgl.db.query.stm; import java.io.PrintStream; import java.util.HashMap; import java.util.Map; import hdgl.db.query.condition.AbstractCondition; public class SimpleStateMachineWithData<T> { AbstractCondition[] edgeAlphabet; AbstractCondition[] vertexAlphabet; int states = 1; Map<Integer, int[]> transitions = new HashMap<Integer, int[]>(); Map<Integer, T> stateData = new HashMap<Integer, T>(); Map<Integer, Boolean> success = new HashMap<Integer, Boolean>(); public SimpleStateMachineWithData(AbstractCondition[] edgeAlphabet, AbstractCondition[] vertexAlphabet) { super(); this.edgeAlphabet = edgeAlphabet; this.vertexAlphabet = vertexAlphabet; } public AbstractCondition[] getVertexAlphabet() { return vertexAlphabet; } public void setVertexAlphabet(AbstractCondition[] vertexAlphabet) { this.vertexAlphabet = vertexAlphabet; } public AbstractCondition[] getEdgeAlphabet() { return edgeAlphabet; } public void setEdgeAlphabet(AbstractCondition[] edgeAlphabet) { this.edgeAlphabet = edgeAlphabet; } public int getStates() { return states; } public int findState(T data){ for (Map.Entry<Integer, T> dataEntry : stateData.entrySet()) { if(dataEntry.getValue().equals(data)){ return dataEntry.getKey(); } } return -1; } public int addState(T data, boolean isSuccess) { transitions.put(states,new int[vertexAlphabet.length+edgeAlphabet.length]); stateData.put(states,data); success.put(states,isSuccess); states++; return states - 1; } public void addTransition(int inState, int toState, int input, boolean isVertex){ if(!isVertex){ input += vertexAlphabet.length; } transitions.get(inState)[input] = toState; } public void print(PrintStream out){ out.print("states\t"); for (AbstractCondition ac : vertexAlphabet) { out.print(ac+"\t"); } out.print("|"); for (AbstractCondition ac : edgeAlphabet) { out.print("\t"+ac); } out.println(); for(int i=0;i<states;i++){ out.print(i+(success.get(i)?"!":"")+"\t"); for (int j = 0; j < vertexAlphabet.length; j++) { out.print(transitions.get(i)[j]+"\t"); } out.print("|"); for (int j = 0; j < edgeAlphabet.length; j++) { out.print("\t"+transitions.get(i)[j+vertexAlphabet.length]); } out.print("\t>\t"+stateData.get(i)); out.println(); } } public SimpleStateMachine removeData() { SimpleStateMachine stm = new SimpleStateMachine(edgeAlphabet, vertexAlphabet); Map<Integer, Integer> newids = new HashMap<Integer, Integer>(); for (Map.Entry<Integer, Boolean> states : success.entrySet()) { newids.put(states.getKey(), stm.addState(states.getValue())); } for(Map.Entry<Integer, int[]> t:transitions.entrySet()){ int[] ts = t.getValue(); for (int i = 0; i < ts.length; i++) { if(ts[i]>0){ if(i<vertexAlphabet.length){ stm.addTransition(newids.get(t.getKey()), newids.get(ts[i]), i, true); }else{ stm.addTransition(newids.get(t.getKey()), newids.get(ts[i]), i-vertexAlphabet.length, false); } } } } return stm; } }