Browse Source

Add code to find path between states

Fabio Battaglia 4 years ago
parent
commit
40a97a0b81

+ 7 - 2
src/main/java/info/hkzlab/dupal/analyzer/palanalisys/graph/PathFinder.java

@@ -10,7 +10,7 @@ public class PathFinder {
    private PathFinder() {};
 
    @SuppressWarnings("unchecked")
-   public static GraphLink[] findPathToNearestUnfilledState(GraphState start) {
+   public static GraphLink[] findPathToState(GraphState start, GraphState dest) {
        Map<Integer, ArrayList<GraphLink>> pathMap = new HashMap<>();
        Queue<GraphState> statesQueue = new LinkedList<>();
        ArrayList<GraphLink> linkStack = null;
@@ -20,7 +20,8 @@ public class PathFinder {
 
        while(currentState != null) {
            linkStack = pathMap.get(currentState.hashCode()); // Get the map to the current state
-           if(!currentState.isStateFull()) return linkStack.toArray(new GraphLink[linkStack.size()]); // Ok, we found a state where we need to map other links
+           if(((dest == null) && !currentState.isStateFull()) ||
+           ((dest != null) && currentState.equals(dest))) return linkStack.toArray(new GraphLink[linkStack.size()]); // Ok, we found a state where we need to map other links
        
            GraphLink[] stateLinks = currentState.getLinks(); // Get links present in the current state
 
@@ -39,4 +40,8 @@ public class PathFinder {
 
        return null; // Found nothing...
    }
+
+   public static GraphLink[] findPathToNearestUnfilledState(GraphState start) {
+       return findPathToState(start, null);
+   }
 }

+ 34 - 2
src/test/java/info/hkzlab/dupal/analyzer/PathFinderTest.java

@@ -47,7 +47,7 @@ public class PathFinderTest {
         assertArrayEquals("PathFinder should find the shortest path between a node and an incomplete one", expectedPath, path);
     }
 
-       @Test
+    @Test
     public void PathFinderShouldProvideNoPathIfAllNodesAreComplete() throws DuPALAnalyzerException {
         OutState os_a = new OutState(new OutStatePins(0x00, 0x00), 3);
         OutState os_b = new OutState(new OutStatePins(0x01, 0x00), 3);
@@ -71,7 +71,6 @@ public class PathFinderTest {
         os_d.addOutLink(new OutLink(os_d, os_b, 0x20));
         os_d.addOutLink(new OutLink(os_d, os_e, 0x30));
 
-        // 'e' is incomplete
         os_e.addOutLink(new OutLink(os_e, os_a, 0x10));
         os_e.addOutLink(new OutLink(os_e, os_d, 0x20));
         os_e.addOutLink(new OutLink(os_e, os_e, 0x20));
@@ -80,4 +79,37 @@ public class PathFinderTest {
         
         assertArrayEquals("PathFinder should return null if no incomplete node exists", null, path);
     }
+
+    @Test
+    public void PathFinderShouldProvideShortestPathBetweenStates() throws DuPALAnalyzerException {
+        OutState os_a = new OutState(new OutStatePins(0x00, 0x00), 3);
+        OutState os_b = new OutState(new OutStatePins(0x01, 0x00), 3);
+        OutState os_c = new OutState(new OutStatePins(0x02, 0x00), 3);
+        OutState os_d = new OutState(new OutStatePins(0x03, 0x00), 3);
+        OutState os_e = new OutState(new OutStatePins(0x04, 0x00), 3);
+
+        os_a.addOutLink(new OutLink(os_a, os_a, 0x10));
+        os_a.addOutLink(new OutLink(os_a, os_b, 0x20));
+        os_a.addOutLink(new OutLink(os_a, os_c, 0x30));
+
+        os_b.addOutLink(new OutLink(os_b, os_a, 0x10));
+        os_b.addOutLink(new OutLink(os_b, os_e, 0x20));
+        os_b.addOutLink(new OutLink(os_b, os_d, 0x30));
+        
+        os_c.addOutLink(new OutLink(os_c, os_a, 0x10));
+        os_c.addOutLink(new OutLink(os_c, os_b, 0x20));
+        os_c.addOutLink(new OutLink(os_c, os_d, 0x30));
+        
+        os_d.addOutLink(new OutLink(os_d, os_c, 0x10));
+        os_d.addOutLink(new OutLink(os_d, os_b, 0x20));
+        os_d.addOutLink(new OutLink(os_d, os_e, 0x30));
+
+        os_e.addOutLink(new OutLink(os_e, os_a, 0x10));
+        os_e.addOutLink(new OutLink(os_e, os_d, 0x20));
+        os_e.addOutLink(new OutLink(os_e, os_e, 0x20));
+
+        GraphLink[] path = PathFinder.findPathToState(os_b, os_c);
+        
+        assertEquals("PathFinder should find shortest path between two states", 2, path.length);
+    }
 }