graphLayout/jetbrains.mps.graphLayout.graph/source_gen/jetbrains/mps/graphLayout/algorithms/MaxFlow.java (62 lines of code) (raw):

package jetbrains.mps.graphLayout.algorithms; /*Generated by MPS */ import java.util.Map; import jetbrains.mps.graphLayout.graph.Edge; import jetbrains.mps.graphLayout.graph.Graph; import jetbrains.mps.graphLayout.graph.Node; import jetbrains.mps.internal.collections.runtime.MapSequence; import java.util.HashMap; import java.util.Set; import jetbrains.mps.internal.collections.runtime.SetSequence; import java.util.HashSet; import jetbrains.mps.internal.collections.runtime.ListSequence; import java.util.List; import jetbrains.mps.baseLanguage.closures.runtime._FunctionTypes; public class MaxFlow { public static Map<Edge, Integer> getFlow(Graph graph, Node source, Node target, Map<Edge, Integer> initialCapacity) { Map<Edge, Integer> flow = MapSequence.fromMap(new HashMap<Edge, Integer>()); Map<Edge, Edge> opposite = MapSequence.fromMap(new HashMap<Edge, Edge>()); final Map<Edge, Integer> capacity = MapSequence.fromMap(new HashMap<Edge, Integer>()); Set<Edge> dummyEdges = SetSequence.fromSet(new HashSet<Edge>()); for (Edge edge : ListSequence.fromList(graph.getEdges())) { MapSequence.fromMap(capacity).put(edge, MapSequence.fromMap(initialCapacity).get(edge)); MapSequence.fromMap(flow).put(edge, 0); Edge oppositeEdge = graph.connect(edge.getTarget(), edge.getSource()); MapSequence.fromMap(opposite).put(edge, oppositeEdge); MapSequence.fromMap(opposite).put(oppositeEdge, edge); MapSequence.fromMap(capacity).put(oppositeEdge, 0); SetSequence.fromSet(dummyEdges).addElement(oppositeEdge); } boolean hasPath = true; while (hasPath) { List<Edge> path = ShortestPath.getPath(graph, source, target, Edge.Direction.FRONT, new _FunctionTypes._return_P1_E0<Boolean, Edge>() { public Boolean invoke(Edge edge) { return MapSequence.fromMap(capacity).get(edge) > 0; } }); if (path == null) { hasPath = false; } else { int minCapacity = Integer.MAX_VALUE; for (Edge edge : ListSequence.fromList(path)) { minCapacity = Math.min(minCapacity, MapSequence.fromMap(capacity).get(edge)); } for (Edge edge : ListSequence.fromList(path)) { if (SetSequence.fromSet(dummyEdges).contains(edge)) { Edge realEdge = MapSequence.fromMap(opposite).get(edge); MapSequence.fromMap(flow).put(realEdge, MapSequence.fromMap(flow).get(realEdge) - minCapacity); MapSequence.fromMap(capacity).put(realEdge, MapSequence.fromMap(capacity).get(realEdge) + minCapacity); MapSequence.fromMap(capacity).put(edge, MapSequence.fromMap(flow).get(realEdge)); } else { MapSequence.fromMap(flow).put(edge, MapSequence.fromMap(flow).get(edge) + minCapacity); MapSequence.fromMap(capacity).put(edge, MapSequence.fromMap(capacity).get(edge) - minCapacity); MapSequence.fromMap(capacity).put(MapSequence.fromMap(opposite).get(edge), MapSequence.fromMap(flow).get(edge)); } } } } for (Edge edge : SetSequence.fromSet(dummyEdges)) { graph.removeEdge(edge); } return flow; } }