package items; import org.jgrapht.Graph; import org.jgrapht.event.ConnectedComponentTraversalEvent; import org.jgrapht.event.EdgeTraversalEvent; import org.jgrapht.event.TraversalListener; import org.jgrapht.event.VertexTraversalEvent; import org.jgrapht.graph.DefaultDirectedWeightedGraph; import org.jgrapht.graph.DefaultWeightedEdge; import org.jgrapht.graph.EdgeReversedGraph; import org.jgrapht.traverse.DepthFirstIterator; import org.jgrapht.traverse.GraphIterator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Utils { public static Map getRawOnly(Map totals) { Map raws = new HashMap<>(); for (Item item : totals.keySet().stream().filter(Item::isRaw).collect(Collectors.toList())) { raws.put(item, totals.get(item)); } return raws; } public static Map shorten(Map totals) { Map shortend = new HashMap<>(); totals.forEach((item, e) -> shortend.put(item.getName(), e)); return shortend; } public static String dotID(Item item) { String name = item.getName() + "_" + item.sum + "__" + (String.valueOf(item.getProductionRate()).replace(".", "_")); name = name.replace(" ", "").replace(".", ""); return name; } public static void fixSums(Item target, Graph graph) { System.err.println(target); EdgeReversedGraph inverse = new EdgeReversedGraph<>(graph); GraphIterator iterator = new DepthFirstIterator<>(inverse, target); iterator.addTraversalListener(new TraversalListener() { @Override public void connectedComponentFinished(ConnectedComponentTraversalEvent e) { System.out.println("\tconnectedComponentFinished: " + e); } @Override public void connectedComponentStarted(ConnectedComponentTraversalEvent e) { System.out.println("\tconnectedComponentStarted: " + e); } @Override public void edgeTraversed(EdgeTraversalEvent e) { System.out.println("\tedgeTraversed: " + e + "---> " + e.getEdge()); } @Override public void vertexTraversed(VertexTraversalEvent e) { System.out.println("\tvertexTraversed: " + e + "---> " + e.getVertex().getName()); } @Override public void vertexFinished(VertexTraversalEvent e) { System.out.println("\tvertexFinished: " + e); } }); while (iterator.hasNext()) { Item i = iterator.next(); System.out.println(i.getName()); } } public static Graph merge(Graph graph0, Graph graph1) { Graph result = new DefaultDirectedWeightedGraph<>(ProductionEdge.class); graph0.vertexSet().forEach(result::addVertex); graph0.edgeSet().forEach(productionEdge -> result.addEdge(graph0.getEdgeSource(productionEdge), graph0.getEdgeTarget(productionEdge), productionEdge)); graph1.vertexSet().forEach(result::addVertex); graph1.edgeSet().forEach(productionEdge -> { List collect = result.edgeSet().stream().filter(productionEdge1 -> productionEdge1.hasTarget(productionEdge.getTarget())).collect(Collectors.toList()); collect.forEach(edge -> { Item src = result.getEdgeSource(edge); Item target = result.getEdgeTarget(edge); Item target2 = graph1.getEdgeTarget(productionEdge); if (target != target2) { result.addEdge(src, target2, productionEdge); } else { result.removeEdge(edge); result.addEdge(src, target, edge); } }); if (collect.isEmpty()) { result.addEdge(graph1.getEdgeSource(productionEdge), graph1.getEdgeTarget(productionEdge), productionEdge); } }); return result; } }